簡體   English   中英

過濾后獲取位置Recyclerview

[英]Get position after filtering Recyclerview

我有一個帶有searchview的recyclerview。

在每一行中,我都為多個選擇添加了復選框。 但是當我想搜索某些內容時,我會檢查一些行。 當我返回所有行時,位置混合在一起。

我在適配器中添加了getItemViewType和getItemId,但是什么也沒發生

過濾recyclerview時出現錯誤位置

MyAdapter類

public class ExpandableListSearchAdapter extends RecyclerView.Adapter<ExpandableListSearchAdapter.MyViewHolder> implements Filterable {

    private List<RowModel> contactList;
    private List<RowModel> contactListFiltered;
    private Context context;
    private int type;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView textName;
        public AppCompatCheckBox checkBox1;

        MyViewHolder(View view) {
            super(view);
            textName = view.findViewById(R.id.textName);
            checkBox1 = view.findViewById(R.id.checkBox1);
        }
    }

    ExpandableListSearchAdapter(Context context, List<RowModel> contactList, int type) {
        this.context = context;
        this.contactList = contactList;
        this.type = type;
        this.contactListFiltered = contactList;
    }

    @NonNull
    @Override
    public ExpandableListSearchAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_searched_recycler_checkbox, viewGroup, false);
        return new ExpandableListSearchAdapter.MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ExpandableListSearchAdapter.MyViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        final RowModel contact = contactListFiltered.get(position);
        holder.textName.setText(contact.getText());

        holder.checkBox1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkItem(position, holder);
            }
        });
    }

    private void checkItem(int position, MyViewHolder holder) {
        RowModel rm = contactListFiltered.get(position);

        switch (type) {
            case 1:
                if (holder.checkBox1.isChecked()) {
                    holder.checkBox1.setChecked(true);
                    UsedDatasSearch.addToListSearchedComputer(rm);
                }else{
                    holder.checkBox1.setChecked(false);
                    UsedDatasSearch.removeToListSearchedComputer(rm);
                }
                break;
             case 2:
                if (holder.checkBox1.isChecked()) {
                    holder.checkBox1.setChecked(true);
                    UsedDatasSearch.addToListSearchedComputerCpu(rm);
                }else{
                    holder.checkBox1.setChecked(false);
                    UsedDatasSearch.removeToListSearchedComputerCpu(rm);
                }
                break;
        }


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

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

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

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    contactListFiltered = contactList;
                } else {
                    List<RowModel> filteredList = new ArrayList<>();
                    for (RowModel row : contactList) {

                        if (row.getText().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                        }
                    }

                    contactListFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = contactListFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                contactListFiltered = (ArrayList<RowModel>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

}

逐步截圖

所有記錄

當我過濾一些行

搜索一些行

畢竟我重置過濾器

重置過濾器

嘗試使您的持有人成為最終人,然后編寫以下代碼:

 holder.checkBox1.setTag(position);

 holder.checkBox1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int pos = (int)view.getTag();
            checkItem(pos, holder);
        }
    });

將contactlistfiltered替換為contactlist:

  private void checkItem(int position, MyViewHolder holder) {
    RowModel rm = contactList.get(position);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM