首页 > 解决方案 > 使用firestore刷新recyclerview后保持复选框处于激活状态

问题描述

当我单击 RecyclerView 中的复选框时,它被激活,一切正常,但是当我刷新布局并且不再选中复选框时。

使用 Firestore 刷新 RecyclerView 后如何保持复选框处于激活状态?

用户类:

class User {
        lateinit var userphoto: StorageReference
        lateinit var username:String
        lateinit var title:String
        lateinit var notes: String
        lateinit var id: String
        var isSelected:Boolean = false
        constructor( id: String?,username:String?, userphoto:StorageReference?
            , title: String?, notes: String?, isSelected:Boolean?) {
            this.title= title!!
            this.id= id!!
            this.username= username!!
            this.notes= notes!!
            this.isSelected= isSelected!!
            this.userphoto= userphoto!!
            }

        fun setIsSelected(selected: Boolean) {
            isSelected = selected
        }

    }

我的适配器:CustomAdapter.class

class CustomAdapter( var mylist:ArrayList<User>)
    :RecyclerView.Adapter<CustomAdapter.viewHolde>() {
    var db = FirebaseFirestore.getInstance();
    var currentuser = FirebaseAuth.getInstance().currentUser!!
    private val notebookRef4 = db.collection("ShowData")
    lateinit var c: Context


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolde {

        var v = LayoutInflater.from(parent.context)
            .inflate(R.layout.iktem_list, parent, false)
        return viewHolde(v)
    }

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

    override fun onBindViewHolder(holder: viewHolde, position: Int) {
        holder.likee.setOnCheckedChangeListener(null)
        holder.likee.setChecked(mylist.get(position).isSelected)
        holder.likee.setOnCheckedChangeListener { buttonView, isChecked ->
            mylist.get(position).setIsSelected(isChecked)
            var mynote = UserUID(mylist.get(position).id)
            if (isChecked) {
                notebookRef4.document(currentuser.uid)
                    .collection("like").document(mylist.get(position).id).set(mynote)
                mylist.get(position).setIsSelected(isChecked)
            } else {
                notebookRef4.document(currentuser.uid)
                    .collection("like").document(mylist.get(position).id).delete()
                mylist.get(position).setIsSelected(false)
            }
        }
    }


    @SuppressLint("ParcelCreator")
    class viewHolde(item: View) : RecyclerView.ViewHolder(item){
        @SuppressLint("WrongViewCast")
        var likee = item.findViewById(R.id.toggleButton) as ToggleButton
    }}

myMainActivity: RecyclerActivity.class

class RecyclerActivity : AppCompatActivity(){
   var rv:RecyclerView? = null
    var currentuser = FirebaseAuth.getInstance().currentUser!!.uid
    val str= FirebaseStorage.getInstance().reference
    var db = FirebaseFirestore.getInstance();

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_recycler)
        rec()

    }

@SuppressLint("WrongConstant")
fun rec(){
    var myarray=ArrayList<User>()
    rv=findViewById(R.id.idrecycler) as? RecyclerView
    db.collection("ProfileData")
        .addSnapshotListener { querySnapshot, firebaseFirestoreException ->
            if (querySnapshot != null) {
                for(da in querySnapshot) {
                    val note = da.toObject(Note::class.java)
                    var title = note.title
                    var description = note.notes
                    var username = note!!.username
                    var id = note!!.id
                    myarray.add(User(id!!,username!!, str.child(currentuser), title!!, description!!,false))
                }
            }
        }
    rv!!.layoutManager= LinearLayoutManager(this, LinearLayout.VERTICAL,false)
    val c= CustomAdapter(myarray )
    rv!!.adapter=c

}

标签: androidkotlinandroid-recyclerviewgoogle-cloud-firestore

解决方案


因为在从 Firestore 刷新期间,您始终将选中的值设置为 false。

myarray.add(User(id!!,username!!, str.child(currentuser), title!!, description!!,false)) // you set false here

要解决此问题,您必须将选中/取消选中数据存储在 Firestore 中并在用户操作期间更新


推荐阅读