应用过滤后,我在 RecyclerView 中选择项目时遇到问题。这是场景:
我有一个 RecyclerView,使用自定义适配器(PayloadAdapter)显示项目列表。该适配器提供基于服务器名称的过滤功能。但是,在过滤列表并选择一个项目后,该选择与原始未过滤列表中的正确项目不对应。
例如,如果我过滤列表并选择过滤列表中的第一项,它会选择默认未过滤列表中的第一项,同样适用于选择第二个、第三个及后续项目。
我怀疑问题在于我在过滤列表后如何处理项目选择。如何确保项目选择对应于原始未过滤列表中的正确项目?
PayloadAdapter 类:
public class PayloadAdapter extends RecyclerView.Adapter<PayloadAdapter.ViewHolder> implements Filterable {
private final List<PayloadModel> payloadList;
public SimpleDraweeView selectedSImage;
private OnItemClickListener listener;
private final List<PayloadModel> payloadListFiltered;
public PayloadAdapter(List<PayloadModel> payloadList) {
this.payloadList = payloadList;
this.payloadListFiltered = payloadList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
PayloadModel payload = payloadList.get(position);
holder.bind(payload);
}
@Override
public int getItemCount() {
return payloadList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String query = charSequence.toString().toLowerCase().trim();
List<PayloadModel> filteredList = new ArrayList<>();
if (query.isEmpty()) {
filteredList.addAll(payloadList);
} else {
for (PayloadModel payload : payloadList) {
if (payload.getServerName().toLowerCase().contains(query)) {
filteredList.add(payload);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
payloadListFiltered.clear();
payloadListFiltered.addAll((List<PayloadModel>) filterResults.values);
notifyDataSetChanged();
}
};
}
private void loadPayloadIcon() {
neth("ze");
}
public void neth(String pogiko) {
String flagUrl = "" + pogiko + ".webp";
selectedSImage.setImageURI(flagUrl);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView, infoTextView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
nameTextView = itemView.findViewById(R.id.itemNamea);
infoTextView = itemView.findViewById(R.id.sinf);
selectedSImage = itemView.findViewById(R.id.itemImagea);
}
public void bind(PayloadModel payload) {
nameTextView.setText(payload.getServerName());
infoTextView.setText(payload.getPayloadInfo());
loadPayloadIcon();
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
}
}
有效负载活动
public class PayloadActivity extends BaseActivity implements PayloadAdapter.OnItemClickListener {
EditText editTextSearch;
private wamp config;
private Settings mConfig;
private List<PayloadModel> payloadList;
private PayloadAdapter adapter;
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server);
final EditText editTextSearch = findViewById(R.id.editTextSearch);
payloadList = new ArrayList<>();
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new PayloadAdapter(payloadList);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(this);
loadPayloadData();
editTextSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
adapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
我尝试调整 ViewHolder 类中的单击侦听器以从原始列表 (payloadList) 中检索正确的项目,而不是使用过滤列表 (payloadListFiltered) 中的位置。
具体来说,我修改了 ViewHolder 类中的 onClick 方法,以使用 PayloadList.get(getAdapterPosition()) 从原始列表中检索正确的项目并将其位置传递给侦听器。
我期望的是,通过从原始列表中检索项目,所选项目将对应于未过滤列表中的正确项目,无论过滤如何。
错误可能是在 onBindViewHolder 方法中,您采用了未过滤列表的模型:
PayloadModel payload = payloadList.get(position);
尝试:
PayloadModel payload = payloadListFiltered.get(position);
你在 PayloadActivity 的 onItemClick 中做什么 您可以为此添加代码吗