Recycler查看过滤后的项目选择问题

问题描述 投票:0回答:2

应用过滤后,我在 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()) 从原始列表中检索正确的项目并将其位置传递给侦听器。

我期望的是,通过从原始列表中检索项目,所选项目将对应于未过滤列表中的正确项目,无论过滤如何。

java android android-recyclerview android-filterable
2个回答
0
投票

错误可能是在 onBindViewHolder 方法中,您采用了未过滤列表的模型:

PayloadModel payload = payloadList.get(position);

尝试:

PayloadModel payload = payloadListFiltered.get(position);

0
投票

你在 PayloadActivity 的 onItemClick 中做什么 您可以为此添加代码吗

© www.soinside.com 2019 - 2024. All rights reserved.