Флажок в представлении Recycler - PullRequest
0 голосов
/ 06 мая 2020

У меня возникла проблема с использованием флажка в представлении ресайклера. Проблема в том, что когда я проверяю 2-й элемент, то также выбирается элемент снизу списка, и подобное происходит, когда я выбираю любой другой элемент. Я искал stackoverflow и нашел похожие вопросы с ответами, и я пробовал эти решения, но они не работали.

Класс адаптера:

public class addServicesCheckOutAdapter extends RecyclerView.Adapter<addServicesCheckOutAdapter.ViewHolder>  implements Filterable {

private List<ServiceList> listitemS;
private  List<ServiceList> listitemsFilter;
private Context context;

private Map<String,String> hashMap;
private ArrayList<String> pricesList;
private List<String> list;
private int prevSelection = -1;
private int selectedPosition;
private boolean var = false;
Set<Integer> mCheckedItemPositions = new HashSet<>();


public addServicesCheckOutAdapter(List<ServiceList> listitems, Context context) {
    this.listitemS = listitems;
    this.context = context;
    this.listitemsFilter = listitems;
}

public  void filteredList(List<ServiceList> filetList) {
    listitemS = filetList;
    notifyDataSetChanged();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view  = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_add_services,parent,false);

    pricesList = new ArrayList<>();
    hashMap = new ConcurrentHashMap<>();
    list = new ArrayList<>();


    global.addServicesPrices = pricesList;
    global.addServicesNameAndID = hashMap;

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

    final ServiceList listitem = listitemsFilter.get(position);
    holder.tvServiceName.setText(listitem.getService_name());
}

@Override
public int getItemCount() {
    return listitemsFilter.size();
}

@Override
public Filter getFilter() {
    return  new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String Key = constraint.toString();

            if (Key.isEmpty()){
                listitemsFilter = listitemS;
            }
            else {
                List<Listitem> IstFilter = new ArrayList<>();
            }
            FilterResults  filterResults = new FilterResults();
            filterResults.values= listitemsFilter;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            notifyDataSetChanged();
        }
    };
}

public void filterList(ArrayList<ServiceList> filterdNames) {
    this.listitemS = filterdNames;
    notifyDataSetChanged();
}

public static class ViewHolder extends RecyclerView.ViewHolder{

    TextView tvServiceName;
    CheckBox checkBox;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        tvServiceName = itemView.findViewById(R.id.tvServiceName);
        checkBox = itemView.findViewById(R.id.checkBox);
    }




}//View Holder

}

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Задайте в адаптере следующие методы

@Override
 public long getItemId(int position) 
 {
        return position;
 }

 @Override
 public int getItemViewType(int position) 
 {
        return position;
 }

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

0 голосов
/ 06 мая 2020

Вы не устанавливаете checkbox отмеченное состояние в onBindViewHolder. Я предполагаю, что mCheckedItemPositions должен удерживать позиции отмеченных пунктов? Затем добавьте что-то вроде этого:

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

    final ServiceList listitem = listitemsFilter.get(position);
    holder.tvServiceName.setText(listitem.getService_name());
    if (mCheckedItemPositions.contains(position) {
        holder.checkBox.setChecked(true);
    } else {
        holder.checkBox.setChecked(false);
    }
}

Вам также нужно будет добавить флажок onCheckedChanged listener в ваш зритель и обновить mCheckedItemPositions. Примерно так:

checkBox = itemView.findViewById(R.id.checkBox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

       @Override
       public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
            if (isChecked) {
                //add position to mCheckedItemPositions
            } else {
                //remove position from mCheckedItemPositions
            }
       }
   }
);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...