SearchView for RecyclerView 不起作用



我想用RecyclerView实现一个SearchView。

我遵循了一些教程和一些SO答案,但没有一个帮助我。这是我的活动。我有一些项目,我只能按名称过滤。

<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentStart="true"
android:background="#C4C4C9"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:paddingEnd="16dp">
<SearchView
android:id="@+id/search_bar"
android:layout_width="300dp"
android:layout_height="35dp"
android:background="@drawable/border_radius"
android:drawableLeft="@drawable/ic_search_black_24dp"
android:hint="@string/search"
android:inputType="textCapWords"
android:textColorHint="@color/dark_gray"/>
<Button
android:layout_width="80dp"
android:layout_height="35dp"
android:background="@drawable/border_radius"
android:backgroundTint="#C2C2C7"
android:hint="Cancel"
android:textSize="20sp"
android:fontFamily="@font/roboto_black"
style="?android:attr/borderlessButtonStyle" />
</LinearLayout>

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = findViewById(R.id.search_bar);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setActivated(true);
searchView.setQueryHint("Kerko");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
query = getClubs.getName().toLowerCase();
clubsAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (searchView.getQuery().length() == 0) {
clubsAdapter.getFilter().filter("");
}
return false;
}
});
ClubsAdapter clubsAdapter;
private ClubsData filteredClubs;
public ClubsFilter(ClubsAdapter clubsAdapter, ClubsData filteredClubs) {
this.clubsAdapter = clubsAdapter;
this.filteredClubs = filteredClubs;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if(constraint != null && constraint.length() > 0) {
constraint = constraint.toString().toLowerCase();
ClubsData filteredClubs = new ClubsData();
for(ClubsData clubsData : filteredClubs) {
if(clubsData.getName().toLowerCase().contains(constraint)) {
filteredClubs.getName();
}
}
}
FilterResults results = new FilterResults();
results.values = filteredClubs;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredClubs = (ClubsData) results.values;
clubsAdapter.notifyDataSetChanged();
}

我创建了另一个仅用于过滤项目的适配器,但我在 foreach 循环中遇到了另一个问题:

foreach not applicable to type 'al.sqmo.model.ClubsData'

请尝试这个

Your Adapter
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}

私有类 ValueFilter 扩展筛选器 {

@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();

if (constraint == null || constraint.length() == 0) {
results.values = mainArrayList;
results.count = mainArrayList.size();
}
else {
ArrayList<Model> filteredExpenses = new ArrayList<Model>();

for (Model requestModel : mainArrayList) {
if (requestModel.getName().toLowerCase().contains( constraint.toString().toLowerCase()) || date.toLowerCase().contains(constraint.toString().toLowerCase()) ) {
filteredExpenses.add(requestModel);
}
}
results.values = filteredExpenses;
results.count = filteredExpenses.size();
}

return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mainArrayList = (ArrayList<Model>) results.values;
notifyDataSetChanged();
if(mainArrayList.isEmpty())
{
activity.findViewById(R.id.txt_no_result).setVisibility(View.VISIBLE);
}
}
}

问题出在代码的这一部分。

ClubsData filteredClubs = new ClubsData();
for(ClubsData clubsData : filteredClubs) {
if(clubsData.getName().toLowerCase().contains(constraint)) {
filteredClubs.getName();
}
}

您尝试循环ClubsData,它应该实现Iterable接口,以for each方法工作。我想你只是不知道,循环什么,在你的情况下,你需要插Collection<ClubsData>投掷.

只需将您的过滤器替换为这样的东西。

List<ClubsData> filteredClubs = getAdapterData()
for(ClubsData clubsData : filteredClubs) {
if(clubsData.getName().toLowerCase().contains(constraint)) {
// Other code
}
}

最新更新