【问题标题】:RecyclerView Effect Selected items in Android KotlinAndroid Kotlin 中的 RecyclerView 效果选定项
【发布时间】:2019-10-03 10:36:32
【问题描述】:

编程语言: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
                }

            }

        }
        }

    }


}

【问题讨论】:

  • 嗨,Jashan Deep,欢迎来到 StackOverflow!你能添加一个最小的代码和问题陈述吗?这将有助于我们中的一些人更好地了解您的问题。
  • 请从您的视图持有者中添加一些代码 sn-p。我的猜测是您的绑定错误,您缺少有关 recyclerview 及其工作原理的基本信息。
  • 您需要使用adapterPosition而不是位置,但一定要检查!= - 1

标签: android kotlin


【解决方案1】:

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

要更好地了解recyclerview 的选择状态,请参阅this example

在你的model 类中添加一个名为isSelected 的额外属性,其中gettersetter 类似

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);
                }
            }
        });


    }

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2018-04-30
    • 2019-10-18
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多