liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.51k stars 317 forks source link

notifyItemChanged触发调用onRefresh #311

Closed bibubi closed 1 year ago

bibubi commented 1 year ago
class Model(
    override var itemPosition: Int = 0,
    var text: String = "测试"
) : ItemPosition

class RefreshFragment : EngineFragment<FragmentRefreshBinding>(R.layout.fragment_refresh) {
    private val total = 2
    override fun initView() {
        setHasOptionsMenu(true)
        binding.rv.linear().setup {
            addType<Model>(R.layout.item_multi_type_simple)
            onBind {
                val binding = getBinding<ItemMultiTypeSimpleBinding>()
                binding.item.setOnClickListener {
                    Log.d("RefreshFragment","Click")
                    this.getModel<Model>().text = "哈哈哈"
                    bindingAdapter?.notifyItemChanged(modelPosition)
                }
            }
        }

        binding.page.onRefresh {
            Log.d("RefreshFragment","onRefresh")
            val runnable = { // 模拟网络请求, 创建假的数据集

                //上方item每次点击,都会触发onRefresh
                //在通过scope作用域里面设置binding.rv.models = getData()也会造成这样问题
                val data = getData()
                addData(data)

//                //加上index < 1控制 上方item每次点击,则触发onRefresh
//                val data = getData()
//                addData(data) {
//                    index < 1
//                }
            }
            postDelayed(runnable, 1000)
        }.autoRefresh()
    }

    private fun getData(): List<Any> {
        return mutableListOf<Any>().apply {
            for (i in 0..2) {
                add(Model())
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_refresh, menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.menu_loading -> binding.page.showLoading()  // 加载中
            R.id.menu_pull_refresh -> binding.page.autoRefresh() // 下拉刷新
            R.id.menu_refresh -> binding.page.refresh() // 静默刷新
            R.id.menu_content -> binding.page.showContent() // 加载成功
            R.id.menu_error -> binding.page.showError(force = true) // 强制加载错误
            R.id.menu_empty -> binding.page.showEmpty() // 空数据
            R.id.menu_refresh_success -> binding.page.finish() // 刷新成功
            R.id.menu_refresh_fail -> binding.page.finish(false) // 刷新失败
            R.id.menu_no_load_more -> binding.page.finishLoadMoreWithNoMoreData() // 没有更多数据
        }
        return super.onOptionsItemSelected(item)
    }

    override fun initData() {
    }
}

Snipaste_2022-12-16_11-48-12

liangjingkanji commented 1 year ago

Duplicate of #250

liangjingkanji commented 1 year ago

notifyItemChanged回调onBindViewHolder导致的触发预加载导致的问题