【问题标题】:How to clear highlighted items in the recyclerview?如何清除回收站视图中突出显示的项目?
【发布时间】:2019-01-09 04:57:06
【问题描述】:

我已经通过在选择时更改项目的背景颜色来实现回收器视图多项选择。当我从模型中删除这些项目时,项目会被删除,但突出显示不会随着项目的删除而消失,而是应用在剩下的项目上。

我已尝试从模型中删除项目,并在每次删除时通知适配器,如下所示

  for (item in selectedItems) {
                        deleteResidentItem(item.key, sharedPreferences.getString("AuthToken", SHARED_PREFERENCE_DOES_NOT_EXIST))
                        removeSelectedItemsFromModelById(item.key)
                        residentRecyclerViewAdapter.notifyItemRemoved(item.value)
                        residentRecyclerViewAdapter.notifyItemRangeChanged(item.value, mutableResidentList.size)
                    }

即使删除项目后,突出显示的项目仍会随机出现在列表中,如下例所示

我希望从模型中删除后突出显示的视图消失,如何解决这个问题?

适配器实现代码

class ResidentRecyclerViewAdapter( val residentItems: List<ResidentListModel>):RecyclerView.Adapter<ResidentRecyclerViewAdapter.ResidentViewHolder>() {



    lateinit var residentRecyclerViewListenerInterface:ResidentRecyclerViewListenerInterface

    fun initResidentRecyclerViewListenerInterface(listener:ResidentRecyclerViewListenerInterface) {
        residentRecyclerViewListenerInterface = listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ResidentViewHolder {
        var layoutInflater = LayoutInflater.from(parent.context)
        var inflatedLayout = layoutInflater.inflate(R.layout.single_resident_item, parent, false)
        return ResidentViewHolder(inflatedLayout, residentRecyclerViewListenerInterface)
    }

    override fun getItemCount() = residentItems.size
    override fun onBindViewHolder(holder: ResidentViewHolder, posistion:Int) {
        //place to bind the values
        val ModelName = residentItems.get(posistion).ModelName
        val VechicleNo = residentItems.get(posistion).VehicleNo
        val SlNo = residentItems.get(posistion).SlNo
        holder.vehicle_number.text = VechicleNo
        holder.model_name.text = ModelName
        holder.sl_no.text = SlNo.toString()

        holder.resident_item_wrapper.setOnLongClickListener {

            when (holder.is_selected.isChecked) {
                // not checked, then check, add to list
                false-> {
                    holder.resident_item_wrapper.setBackgroundColor(Color.parseColor("#1565c0"))
                    holder.resident_vehicle_number.setTextColor(Color.WHITE)
                    holder.resident_model_name.setTextColor(Color.WHITE)
                    holder.is_selected.setBackgroundColor(Color.WHITE)
                    holder.is_selected.visibility = View.VISIBLE
                    holder.is_selected.isChecked = true
                    residentRecyclerViewListenerInterface.onResidentItemLongClickListener(holder.sl_no.text.toString().toInt(), posistion)

                }

                true -> {
                    // checked then unselect and remove from list
                    holder.resident_item_wrapper.setBackgroundColor(Color.WHITE)
                    holder.resident_vehicle_number.setTextColor(Color.BLACK)
                    holder.resident_model_name.setTextColor(Color.BLACK)
                    holder.is_selected.setBackgroundColor(Color.BLACK)
                    holder.is_selected.visibility = View.GONE
                    holder.is_selected.isChecked = false
                    residentRecyclerViewListenerInterface.onResidentItemLongUnselectClickListener(holder.sl_no.text.toString().toInt(),posistion)

                }
            }
            true
        }
    }
    interface ResidentRecyclerViewListenerInterface {
        fun onResidentItemLongClickListener(Id:Int, Position:Int)
        fun onResidentItemClickListener(Id:Int, Position: Int)
        fun onResidentItemLongUnselectClickListener(Id: Int, Position: Int)
    }

    class ResidentViewHolder(val view: View, residentRecyclerViewListenerInterface:ResidentRecyclerViewListenerInterface):RecyclerView.ViewHolder(view) {
        var vehicle_number:TextView
        var model_name:TextView
        var sl_no:TextView
        var resident_item_wrapper:CardView
        var is_selected:CheckBox
        var resident_vehicle_number:TextView
        var resident_model_name:TextView
        lateinit var residentRecyclerViewListenerInterface:ResidentRecyclerViewListenerInterface

        init {
            vehicle_number = view.resident_vehicle_number
            model_name = view.resident_model_name
            sl_no = view.resident_slno
            resident_item_wrapper = view.resident_item_wrapper
            is_selected = view.is_selected
            resident_vehicle_number = view.resident_vehicle_number
            resident_model_name = view.resident_model_name

        }
    }
}

【问题讨论】:

  • 您突出显示是基于 position 。所以在另一个基础上保持你的突出显示,比如它的 id 或 name 或其他东西
  • 怎么做?我在 onbindviewholder 内设置了一个 onLongClickListener。
  • 从那个监听器我改变了视图背景颜色
  • 我假设您的适配器和 recyclerview 没有很好地实现。请分享适配器的实现。您需要 2 种方法来删除项目(deleteResidentItemremoveSelectedItemsFromModelById)只是一个指标。
  • deleteResidentItem 从服务器中删除该项目,removeSelectedItemsFromModelById 从活动中存在的模型列表中删除

标签: android kotlin android-recyclerview


【解决方案1】:

试试这个:

在你的 POJO 类中取一个 Boolean 变量

public class POJO {

    boolean isSelected;

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

在您的 onBindViewHolder() 方法中进行以下更改

 @Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    if(pojoArrayList.get(position).isSelected()){
        // make selection in your item
    }else {
        //remove selction from you item
    }
}

现在在您的onLongClickListener 中使您的选择成为真实

示例代码

    sampleButton.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {

            // set the status of selection 
            pojoArrayList.get(position).setSelected(true);

            return true;
        }
    });

当你想删除选择时使用这个

  pojoArrayList.get(position).setSelected(false);

当你想从列表中删除项目时,使用 boolean 变量来删除项目

 if(pojoArrayList.get(position).isSelected()){
        //remove the item from list
       // and  notifyDataSetChanged(); after removing the item from list
 }

【讨论】:

  • @leonardkraemer 没有得到你,任何检查我都更新了我的答案
  • 我的情况有一个问题,我一直在使用我的操作栏图标项目来删除选定的项目,我一直在使用两个侦听器与主要活动进行通信,即使我添加了一个成员字段来存储它是否被选中,我应该如何删除删除时的突出显示?
  • @NaveenKingmaker 我在回答中提到了如何remove selectionhow to delete item
  • 无法理解在哪里突出显示这些项目?
  • 很抱歉应该这样做,忘了这样做。感谢 Nilesh 和 leonard 的帮助
【解决方案2】:

你的问题在when (holder.is_selected.isChecked) {

如果在 ViewModel 上检查项目,而不是在 View 上,而且绝对不是在 ViewHolder 中,您应该知道该信息。

它应该类似于if(residentItems.get(posistion).isSelected){(在二进制情况下使用when 是多余的)

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多