[英]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.