RecyclerView Effect Выбранные элементы в Android Kotlin - PullRequest
0 голосов
/ 03 октября 2019

Язык программирования: KOTLIN

Библиотека: androidX

Я использую RecyclerView из библиотеки AndroidX в Kotlin, и возникла одна проблема.

Проблема: Когда яЕсли щелкнуть первый отображаемый элемент, то будут затронуты другие элементы, всегда после 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
                }

            }

        }
        }

    }


}

1 Ответ

1 голос
/ 03 октября 2019

recyclerview повторяет представление в OnBindViewHolder. Так что при щелчке элементов оно отражается в некоторых других позициях.

Для лучшего понимания состояния выбора recyclerview см. в этом примере

В свой класс model добавьте дополнительное свойство с именем 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);
                }
            }
        });


    }

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...