首页 > 解决方案 > Android Kotlin 中的 RecyclerView 效果选定项

问题描述

编程语言:KOTLIN

库:androidX

我在 Kotlin 中使用来自 AndroidX 库的 RecyclerView,但出现了一个问题。

问题:当我单击第一个显示项目时,更多项目受到影响,总是在 10 个项目之后。

示例:如果单击第一个项目,则项目 1、11、21,31 也会受到影响。

这是代码

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.jdwebservices.mybigbachat.R
import com.jdwebservices.mybigbachat.data.products
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.product_row.view.*
import kotlin.collections.ArrayList


class product_adapter(var contet:Context, var catlist: ArrayList<products>): RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val v:View=LayoutInflater.from(contet).inflate(R.layout.product_row,parent,false)
        return clientHolders(v)
    }
    override fun getItemCount(): Int {
        return catlist.size
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        holder.itemView.setOnClickListener { }
         (holder as clientHolders).bind(
           catlist[position].product_name_app_english,
           catlist[position].product_image,
           catlist[position].mrp,
           catlist[position].sale_rate,
             position
       )
    }

    class clientHolders(itemView: View): RecyclerView.ViewHolder(itemView)
    {
        val BASE_URL = "https://mybachatbasket.xyz/"
        var counter = -1
        fun bind(
            product_name_app_english: String,
            product_image: String,
            mrp: Int,
            sale_rate: Int,
            products: Int
        ) {
            if (counter == -1) {
                itemView.add_1.visibility = View.VISIBLE
                itemView.add_to_cart.visibility = View.GONE
            }
            var pos = adapterPosition
            if(pos == products){
            itemView.product_name.text = product_name_app_english

            itemView.mrp_full.visibility = View.VISIBLE
            itemView.mrp.text = mrp.toString()
            itemView.sale_rate.text = sale_rate.toString()

            var eb: String = BASE_URL + "admin/resource/uploads/" + product_image
            eb = eb.replace(" ", "%20")
            Picasso.get().load(eb).into(itemView.product_image)

            itemView.add_1.setOnClickListener {

                counter = 1
                 Toast.makeText(itemView.context, pos.toString(),Toast.LENGTH_LONG).show()
               // Toast.makeText(itemView.context, products.toString(), Toast.LENGTH_LONG).show()
                //  add_cart(product_id,category_id,counter)
if (pos >= 0) {
    itemView.add_1.visibility = View.GONE
    itemView.add_to_cart.visibility = View.VISIBLE
    itemView.count.text = counter.toString()
}else{
    itemView.add_1.visibility = View.VISIBLE
    itemView.add_to_cart.visibility = View.GONE

}

            }

            itemView.add.setOnClickListener {

                counter++
                itemView.count.text = counter.toString()

            }
            itemView.delete.setOnClickListener {

                counter--
                itemView.count.text = counter.toString()
                //  updtae_cart(last_id,counter);
                if (counter == 0) {
                    itemView.add_1.visibility = View.VISIBLE
                    itemView.add_to_cart.visibility = View.GONE
                }

            }

        }
        }

    }


}

标签: androidkotlin

解决方案


recyclerview回收视图。因此OnBindViewHolder,当单击项目时,它会反映在其他一些位置。

为了更好地理解选择状态,recyclerview请参见这个例子

在您的班级中添加一个名为with和likemodel的额外属性isSelectedgettersetter

public class YourModel{
    // your other properties

    private boolean isSelected;

    public boolean getSelected() {
        return isSelected;
    }

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

在您的适配器中,您必须设置isSelected如果true用户单击该项目,否则它将在您的onBindViewHolder(). 下面是一个例子

@Override
    public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int position) {
        holder.checkBox.setText("Checkbox " + position);

        // here you can check is this item clicked or not 
        if(imageModelArrayList.get(position).getSelected()){
           holder.checkBox.setChecked(true);
        }

        holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal());
        holder.checkBox.setTag(position);
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Integer pos = (Integer) holder.checkBox.getTag();
                Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + " clicked!", Toast.LENGTH_SHORT).show();

                if (imageModelArrayList.get(pos).getSelected()) {
                    imageModelArrayList.get(pos).setSelected(false);
                } else {
                    imageModelArrayList.get(pos).setSelected(true);
                }
            }
        });


    }

希望它可以帮助你。


推荐阅读