![](/img/trans.png)
[英]SearchView filter is working as intented, but retrieves old item position on RecyclerView in fragment
[英]SearchView for RecyclerView is not working
我想用RecyclerView實現SearchView。
我遵循了一些教程和一些答案,但是沒有一個對我有幫助。 這是我的活動。 我有一些僅需按名稱過濾的項目。
<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擴展了Filter {
@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
方法使用。 我認為您只是不知道要循環什么,在這種情況下,您需要插入throw Collection<ClubsData>
。
只需將過濾器替換為這樣的東西即可。
List<ClubsData> filteredClubs = getAdapterData()
for(ClubsData clubsData : filteredClubs) {
if(clubsData.getName().toLowerCase().contains(constraint)) {
// Other code
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.