如何在具有两个不同 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
}
}
}
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
}
}
}