如何在具有两个不同 Viewholder 的异构 RecyclerView 中实现过滤器(搜索)?

How to implement filer (search) in a heterogeneous recyclerview with two different viewholders?

Here is the code 我无法在 heterogeneous recyclerview 中使用两个不同的 viewholder 实现搜索。谁能给我一些建议。此外,我对 recyclerview 的看法是 textViews 和 cardViews。 CardView 上面写有数据,例如姓名、年龄和 phone 号码。我想用名字和 phone 号码搜索。没有日期 textView。

See publishResults image

提前致谢。

这是我的代码:

            if (charString.isEmpty()) {
                // Search is empty/Nothing Entered
                mAppointmentsList = mAppointmentsListFiltered;
            } else {
                List<DataAppointments> filterResults = new ArrayList<>();

                for (DataAppointments data : mAppointmentsList) {
                    if (data instanceof DataPatientDetails) {
                        DataPatientDetails details = (DataPatientDetails) data;

                        if (details.getName().toLowerCase().contains(charString.toLowerCase()) ||
                                details.getPhone().toLowerCase().contains(charString.toLowerCase()) ||
                                details.getId().toLowerCase().contains(charString.toLowerCase())) {
                            filterResults.add(data);

                            if (BuildConfig.DEBUG)
                                Log.d(TAG, "performFiltering: " + details.getName());
                        }
                    }
                }

                mAppointmentsListFiltered = filterResults;
                if (BuildConfig.DEBUG)
                    Log.d(TAG, "performFilteringPatientListFiltered: " + mAppointmentsListFiltered);
            }

            FilterResults results = new FilterResults();
            results.values = mAppointmentsListFiltered;
            results.count = mAppointmentsListFiltered.size();
            if (BuildConfig.DEBUG)
                Log.d(TAG, "performFilteringResultsUpcoming: " + results.count);
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mAppointmentsListFiltered = (ArrayList<DataAppointments>) results.values;
            if (BuildConfig.DEBUG) Log.d(TAG, "publishResults: " + mAppointmentsListFiltered);
            notifyDataSetChanged();
        }
    };
}`

还有我的 onQueryChangeListener :

    // Query Search in Material Search view
private void querySearch() {
    if (getActivity() != null)
        mSearchView = getActivity().findViewById(R.id.search_view_upcoming);
    mSearchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            if (BuildConfig.DEBUG) Log.d(TAG, "onQueryTextSubmit: " + query);
            mAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (BuildConfig.DEBUG) Log.d(TAG, "onQueryTextChange: " + newText);
            mAdapter.getFilter().filter(newText);
            if (BuildConfig.DEBUG) Log.d(TAG, "onQueryTextChange: " + mAdapter.getItemCount());

            return false;
        }
    });
}

搜索不靠视图,靠的是数据。根据您的条件对您的列表应用过滤器,并使用 viewType 区分您的视图。

基于您发布的代码。

在 else 语句中,我不确定比较的是什么。您可以有条件检查 DataAppointments 是否属于 DataPatientDetails 类型,然后进行比较。我假设 mAppointmentsList 是一个实际的数据列表。

else {
 for (DataAppointments data : mAppointmentsList) {
  if (data instanceof DataPatientDetails) {
    DataPatientDetails details = (DataPatientDetails) data;
    // do your comparision here, if it passes, then add to the filtered results
  }
 }
}