1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package cn.flightfeather.thirdappmodule.view.recyclerview
 
import android.annotation.SuppressLint
import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import cn.flightfeather.thirdappmodule.R
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
 
/**
 * RecyclerView模块
 * @author riku
 * Date: 2019/11/22
 * reference layout is [R.layout.layout_recycler_view_refresh]
 */
abstract class RecyclerViewPanel<T>(private val dataLoadModel: DataLoadModel<T>, private val rootView: View? = null) : RecyclerViewSetInterface<T>, SwipeRefreshLayoutSetInterface {
 
    constructor(dataLoadModel: DataLoadModel<T>, recyclerView: RecyclerView, context: Context?, refreshLayout: SwipeRefreshLayout? = null) : this(dataLoadModel) {
        context?.let { this.context = it }
        tempRecyclerView = recyclerView
        this.tempRefreshLayout = refreshLayout
    }
 
    private lateinit var context: Context
    private var tempRecyclerView: RecyclerView? = null
    private var tempRefreshLayout: SwipeRefreshLayout? = null
 
    /**
     * 在接口[RecyclerViewSetInterface.initList]中会自动初始化
     */
    override var adapter: BaseRecyclerAdapter<T>? = null
 
    private var mRecyclerView: RecyclerView? = null
 
    private var refreshLayout: SwipeRefreshLayout? = null
 
    init {
        if (rootView != null) {
            this@RecyclerViewPanel.context = rootView.context
        }
    }
 
    open fun init() {
        initViews()
        initList()
        initSwipeRefreshLayout()
        initObserver()
    }
 
    private fun initViews() {
        mRecyclerView = rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
        refreshLayout = rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
    }
 
    open fun initObserver() {
        dataLoadModel.loadStateListener = {
            refreshLoadingStatus(it)
        }
 
        dataLoadModel.dataLoadListener = {
            if (dataLoadModel.isFirstData()) {
                setNewData(it)
            } else {
                addData(it)
            }
        }
    }
 
    override fun getRecyclerView(): RecyclerView? = mRecyclerView ?: rootView?.findViewById(R.id.recycler_view) ?: tempRecyclerView
 
    override fun onRefreshDone() = stopRefresh()
    override fun onRefreshFail() = stopRefresh()
    override fun onLoadMoreEnd() = Unit
    override fun onLoadMoreComplete() = Unit
    override fun onLoadMoreFail() = Unit
    override fun onRefreshNone() = stopRefresh()
 
    override fun getMyLayoutManager(): RecyclerView.LayoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
 
    override fun getItemLayoutIdMap(): Map<Int, Int> = emptyMap()
 
    override fun getSectionLayoutId(): Int = R.layout.recycler_item_section_head
 
    override fun getSectionDataList(): List<MySection<T>> = MySection.convert2Section(dataLoadModel.dataList)
 
    override fun onItemClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<T>) = Unit
 
    override fun onItemChildClick(adapter: BaseQuickAdapter<Any?, BaseViewHolder>, view: View, position: Int, dataList: List<T>) = Unit
 
    override fun enableLoadMore(): Boolean = true
 
    override fun onLoadMoreStart() {
        if (getSwipeRefreshLayout()?.isRefreshing == true) {
            adapter?.loadMoreComplete()
            return
        }
    }
 
    override fun onLoadMoreRequested() = dataLoadModel.loadMore()
 
    override fun enableUpFetch(): Boolean = false
 
    @SuppressLint("InflateParams")
    override fun getMyEmptyView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_empty_view, null)
 
    @SuppressLint("InflateParams")
    override fun getMyLoadingView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_loading_view, null)
 
    @SuppressLint("InflateParams")
    override fun getMyLoadFailView(): View? = LayoutInflater.from(context).inflate(R.layout.layout_load_fail_view, null)
 
    //******************************SwipeRefreshLayout************************************************************
 
    override fun getSwipeRefreshLayout(): SwipeRefreshLayout? = refreshLayout ?: rootView?.findViewById(R.id.refresh_layout) ?: tempRefreshLayout
 
    override fun enableRefresh(): Boolean = true
 
    override fun needSwipeRefresh(): Boolean = true
 
    override fun onRefreshRequested() {
        //第三方recyclerView的上拉加载结束后,如果下拉刷新执行,则应该重新打开监听
        try {
            if (!adapter?.isLoadMoreEnable!!) {
                setLoadMore()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        dataLoadModel.refresh()
    }
 
    override fun getColorList(): Array<Int> = arrayOf(
            ContextCompat.getColor(context, R.color.colorPrimary),
            ContextCompat.getColor(context, R.color.colorPrimaryDark),
            ContextCompat.getColor(context, R.color.colorAccent)
    )
}