Изменить вид текста элемента нижнего колонтитула - PullRequest
0 голосов
/ 26 марта 2019

Привет У меня есть условие, когда я должен добавить другой viewType с текстом

show more или loading...

в нижней части окна рециркуляции

Я успешно добавил представление нижнего колонтитула с помощью show more, а также добавил прослушиватель в это представление элемента нижнего колонтитула для загрузки дополнительных данных, здесь все работает нормально. Так как у меня есть родительский макет обновления свайпов для просмотра повторных загрузок, я показываю включение процесса swiperefresh при загрузке и отключение процесса swiperefresh при завершении загрузки. Теперь мне нужно, чтобы каждый раз, когда я нажимал на тип представления 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 () } Есть ли что-то, что мне нужно сделать с этим подходом, потому что пользователи могут нажимать несколько раз в нижнем колонтитуле, не позволяя приложению загружать удаленные данные. Надеюсь, вы поняли ситуацию, если не дайте мне знать. Заранее спасибо

Вот скриншот, чего я добился screenshot

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Не могли бы вы попытаться поместить свой код функции в enableShowMore () в onBindViewHolder () или установить holder.bind для FooterViewHolder и поместите код в функцию связывания.

Дайте мне знать, если это полезно или нет.

0 голосов
/ 26 марта 2019

Можете ли вы попробовать отключить кнопку просмотра нижнего колонтитула, когда пользователь нажмет на нее?

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()
}
...