lmw
2023-05-12 f67802a41f9e01444d1115f34ecc6e1beb05fc3b
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
143
144
145
146
package cn.sinata.xldutils.fragment
 
import android.os.Bundle
import androidx.core.content.ContextCompat
import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import cn.sinata.xldutils.R
import cn.sinata.xldutils.adapter.HFRecyclerAdapter
import cn.sinata.xldutils.sysErr
import cn.sinata.xldutils.view.SwipeRefreshRecyclerLayout
import org.jetbrains.anko.support.v4.find
import org.jetbrains.anko.textColor
import org.jetbrains.anko.wrapContent
import kotlin.properties.Delegates
 
/**
 * RecyclerView的fragment
 */
abstract class RecyclerFragment() : BaseFragment() {
    /**
     *
     * 如果使用在viewpager等只回收view不回收数据的控件内,这里不能是用by lazy和val ,会导致该声明的既不能重新赋值,也指向错误的view地址,从而出现未知bug。
     * 如:RecyclerView: No adapter attached; skipping layout Error
     */
    var mSwipeRefreshLayout by Delegates.notNull<SwipeRefreshRecyclerLayout>()
 
    protected open var rootFl by Delegates.notNull<FrameLayout>()
    protected open var rootLayout by Delegates.notNull<LinearLayout>()
 
    override fun contentViewId(): Int = R.layout.base_recyclerview_layout
 
    private var emptyView: TextView? = null
 
    protected var adapter : RecyclerView.Adapter<*>? = null
    protected abstract fun setAdapter(): RecyclerView.Adapter<*>
    /**
     * 下拉刷新
     */
    protected open fun pullDownRefresh() {}
 
    /**
     * 加载更多
     */
    protected open fun loadMore() {}
 
    /**
     * @return 默认上拉下拉同时存在
     */
    open fun getMode(): SwipeRefreshRecyclerLayout.Mode {
        return SwipeRefreshRecyclerLayout.Mode.Both
    }
 
    /**
     * @return  默认垂直布局。
     */
    open fun getLayoutManager(): RecyclerView.LayoutManager {
        return LinearLayoutManager(context, LinearLayoutManager.VERTICAL,false)
    }
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        rootLayout = find(R.id.root_layout)
        rootFl = find(R.id.root_layout)
        mSwipeRefreshLayout = find(R.id.swipeRefreshLayout)
        sysErr("---getLayoutManager()--->"+getLayoutManager())
        mSwipeRefreshLayout.setLayoutManager(getLayoutManager())
        mSwipeRefreshLayout.setOnRefreshListener(object : SwipeRefreshRecyclerLayout.OnRefreshListener {
            override fun onRefresh() {
                pullDownRefresh()
            }
 
            override fun onLoadMore() {
                loadMore()
            }
        })
        mSwipeRefreshLayout.setMode(getMode())
        adapter = setAdapter()
        mSwipeRefreshLayout.setAdapter(adapter)
        mSwipeRefreshLayout.isRefreshing = false
 
    }
 
    override fun onDestroyView() {
        super.onDestroyView()
        try {
            adapter!!.unregisterAdapterDataObserver(observer)
        } catch (e: Exception) {
        }
        //同步置空view
        emptyView = null
    }
 
    protected fun addEmptyView(text:String,leftRes:Int=0,topRes:Int=0,rightRes:Int=0,bottomRes:Int=0) {
        if (emptyView == null) {
            emptyView = TextView(context)
            val lp = FrameLayout.LayoutParams(wrapContent, wrapContent)
            lp.gravity = Gravity.CENTER
            emptyView!!.layoutParams = lp
            emptyView!!.gravity = Gravity.CENTER
            emptyView!!.textColor = ContextCompat.getColor(context!!,R.color.textColor99)
            emptyView!!.setTextSize(TypedValue.COMPLEX_UNIT_SP,16f)
            emptyView!!.setCompoundDrawablesWithIntrinsicBounds(leftRes,topRes,rightRes,bottomRes)
            rootFl.addView(emptyView,0)
            if (adapter != null) {
                adapter!!.registerAdapterDataObserver(observer)
                toggleEmptyView()
            }
        }
        emptyView!!.text = text
    }
 
    private val observer:RecyclerView.AdapterDataObserver = object :RecyclerView.AdapterDataObserver(){
        override fun onChanged() {
            super.onChanged()
            toggleEmptyView()
        }
    }
 
    private fun toggleEmptyView() {
        var count = adapter!!.itemCount
        if (adapter is HFRecyclerAdapter<*>) {
            count = (adapter as HFRecyclerAdapter<*>).getDataItemCount()
        }
        if (emptyView != null) {
            if (count > 0) {
                emptyView!!.visibility = View.GONE
            } else {
                emptyView!!.visibility = View.VISIBLE
            }
        }
    }
 
    /**
     * 设置刷新状态
     * @param refreshing 刷新状态
     */
    fun setRefreshing(refreshing: Boolean) {
        mSwipeRefreshLayout.isRefreshing = refreshing
    }
}