android - 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
}
}
}
}
}
}
解决方案
recyclerview
回收视图。因此OnBindViewHolder
,当单击项目时,它会反映在其他一些位置。
为了更好地理解选择状态,recyclerview
请参见这个例子
在您的班级中添加一个名为with和likemodel
的额外属性isSelected
getter
setter
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);
}
}
});
}
希望它可以帮助你。
推荐阅读
- python - 确保 pandas 数据框的列具有唯一值
- html - 需要在离子头上的离子卡
- javascript - 如果对象具有重复属性,则从列表中删除对象
- python - selenium web driver 无法读取单页架构中的网络调用,主要是后续页面(selenium/chrome web driver/Python)
- python - 我尝试使用烧瓶部署我的机器学习模型并得到错误 SystemExit: 1
- vba - 转发 Outlook 会议
- javascript - 仅在小屏幕上使用按钮更改 div 的高度
- batch-file - 无法使用带有特殊字符的批处理
- python - 在 Django 中创建模型时得到“无法解压不可迭代的 int 对象”
- c# - 在 C# 多线程环境中,是否也需要锁定可枚举对象的 getter 和 setter?