【问题标题】:Change the view text of footer itemView of recyclerview改变recyclerview的footer itemView的view text
【发布时间】:2019-03-26 10:29:37
【问题描述】:

您好,我有一个条件,我必须添加不同的 viewType 和文本

show moreloading...

在回收站视图的底部

我已经成功添加了带有显示更多的页脚视图,并且我已经在这个页脚项目视图上添加了侦听器以加载更多数据,这里一切正常。由于我将滑动刷新布局作为 recyclerview 的父级,因此我在加载时显示启用滑动刷新进度并在加载完成时禁用滑动刷新进度。现在我需要的是,每当我单击 show more 视图类型时,它是附加到回收器视图的页脚,我希望使用 loading... 更改文本,加载完成后,文本应更改为 show more再次。

这是我的适配器类

class MyTransactionAdapter(private val context: Context?,
                       private val transactionList: List<TransactionHistoryResponse>,
                       private val transactionListener: MyTransactionListener) : Filterable,
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private var viewTypeList: Int = 0
private var viewTypeFooter: Int = 1


private var transactionListFiltered = transactionList

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return if (viewType == viewTypeList) {
        val view: View = LayoutInflater.from(context).inflate(R.layout.row_my_transaction, parent, false)
        ListViewHolder(view)
    } else {
        val view: View = LayoutInflater.from(context).inflate(R.layout.row_footer_so_more, parent, false)
        FooterViewHolder(view)
    }
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val myTransaction = transactionListFiltered[position]
    if (holder is ListViewHolder) {
        holder.bind(myTransaction, transactionListener)
    }
}

override fun getItemCount(): Int {
    return transactionListFiltered.size
}

override fun getItemViewType(position: Int): Int {
    return if (position == transactionList.lastIndex) {
        viewTypeFooter
    } else {
        viewTypeList
    }
}

inner class FooterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    init {
        itemView.apply {
            btnShowMore.setOnClickListener {
                transactionListener.onLoadMoreClicked()
            }
        }
    }

    fun enableShowMore(enable: Boolean) {
        if(enable){
            itemView.btnShowMore.text = "show more"

        }else{
            itemView.btnShowMore.text = "loading..."

        }
    }
}
inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    private lateinit var mTransactionStatus: TransactionStatus
    fun bind(myTransaction: TransactionHistoryResponse, transactionListener: MyTransactionListener){
        //logic to populate data on views
       }
    }
 }

这是片段的功能,我在其中进行加载

This function is being called for fetching data from remote

private fun getTransactionHistory() {
    swipeContainer.enableDisableSwipeRefresh(true)
    enableShowMore(false)
  //logic to load web data and hide show swiperefresh
  //when load is success call this function enableShowMore(true)
  //when load is failed call this function enableShowMore(false)
}

@Synchronized
private fun enableShowMore(enable: Boolean) {
    val viewHolder = recyclerView.findViewHolderForAdapterPosition(transactionList.size)
    if (viewHolder is MyTransactionAdapter.FooterViewHolder) {
        viewHolder.enableShowMore(enable)
    }
}

//这是点击页脚视图时的实现方法 覆盖乐趣 onLoadMoreClicked() { fetchTransactionListFromServer() } 我需要用这种方法做些什么,因为用户可以一次单击多个页脚,而无需让应用程序加载远程数据。 如果不让我知道,希望您已经了解情况。提前致谢

这是我实现的截图

【问题讨论】:

    标签: android kotlin android-recyclerview infinite-scroll


    【解决方案1】:

    您可以尝试在用户单击后禁用页脚视图按钮吗?

    fun enableShowMore(enable: Boolean) {
            if( enable ) {
                itemView.btnShowMore.text = "show more"
            } else {
                itemView.btnShowMore.text = "loading..."
            }
            itemView.btnShowMore.isEnabled = enable
        }
    

    更新:

    //In the adapter
    mIsFooterEnabled = false
    
    //In the View holder 
    fun enableShowMore() {
      if( mIsFooterEnabled ) {
          itemView.btnShowMore.text = "show more"    
      } else {
          itemView.btnShowMore.text = "loading..."  
      }
      itemView.btnShowMore.isEnabled = mIsFooterEnabled
    }
    
    //In your activity / fragment
    private fun enableShowMore(enable: Boolean) {
        adapter.mIsFooterEnabled = enable
        adapter.notifyDataSetChanged()
    }
    

    【讨论】:

    • 这是我问的问题。单击此视图时,我无法禁用页脚视图按钮。
    • itemView.btnShowMore.isEnabled = enable,你添加了这行并检查了吗?它仍然没有被禁用吗?
    • 主要是 enableShowMore() 函数永远不会被调用
    • 检查viewholder是否为null,如果它返回null,你需要另一种方法来解决这个问题。如果它为空,我会发布一个不同的解决方案。
    • ViewHolder 不为空。调用的视图是 ListViewHolder 的实例,但我需要 FooterViewHolder 的实例。与此同时,我已经用其他方式完成了。但在这种情况下,我最后在列表中添加了 null,同时成功获取数据并检查了适配器中的项目为 `val da = transactionList[position] return if (da == null) { viewTypeFooter } else { viewTypeList }`
    【解决方案2】:

    您能否尝试将您的函数代码放入 onBindViewHolder() 中的 enableShowMore() 或为 设置 holder.bind FooterViewHolder 并将代码放入 binder 函数中。

    让我知道它是否有用。

    【讨论】:

    • @Vagish 我刚刚提供了修复它的建议。如果它不起作用,那么我可以提供更多信息以及代码。 Ram Mandal 如果它不起作用,请告诉我。
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多