[英]Searchview shows wrong result on Recyclerview with viewpager
我有 viewpager,它有兩個片段
在我的一個片段中,我在該片段中使用 searchview 進行 recyclerview。
這是 recyclerview 適配器:(帶有搜索過濾器)
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyviewHolder> implements Filterable {
ListItemsBinding itembind;
Context co;
List<Items> mylist;
List<Items> copy;
public CustomAdapter(List<Items> mylist, Context co) {
this.mylist = mylist;
copy=new ArrayList<>(mylist);
this.co = co;
}
@NonNull
@Override
public CustomAdapter.MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(co);
itembind= ListItemsBinding.inflate(inflater,parent,false);
return new MyviewHolder(itembind);
}
@Override
public void onBindViewHolder(@NonNull CustomAdapter.MyviewHolder holder, int position) {
Items item = mylist.get(position);
itembind.text.setText(item.getName());
}
@Override
public int getItemCount() {
return mylist.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public Filter getFilter() {
return exampleFilter;
}
private final Filter exampleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Items> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(copy);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Items item : copy) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mylist.clear();
mylist.addAll((List) results.values);
notifyDataSetChanged();
}
};
public class MyviewHolder extends RecyclerView.ViewHolder {
public MyviewHolder(ListItemsBinding itembind) {
super(itembind.getRoot());
itembind.const1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(co,""+mylist.get(getAdapterPosition()).getName(),Toast.LENGTH_SHORT).show();
}
});
}
}
}
Fragment2.java(在這個片段中我實現了onCreateOptionsMenu):
public class Fragment2 extends Fragment implements {
CustomAdapter adaptive;
List<Items> mylist;
Fragment2Binding filesbinding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
filesbinding= FragmentVoiceRecordFilesBinding.inflate(inflater,container,false);
return filesbinding.getRoot();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setdata();
recycle();
}
public void recycle() {
//implementing recyclerview
filesbinding.recycle.setHasFixedSize(true);
RecyclerView.LayoutManager layout = new
LinearLayoutManager(context);
filesbinding.recycle.setLayoutManager(layout);
filesbinding.recycle.scheduleLayoutAnimation();
adaptive= new CustomAdapter(mylist,context);
filesbinding.recycle.setAdapter(adaptive);
}
public void setdata() {
mylist=new ArrayList<>();
mylist.add(new Items("1"));
mylist.add(new Items("2"));
mylist.add(new Items("3"));
mylist.add(new Items("4"));
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
MenuItem searchItem = menu.findItem(R.id.actionSearch);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adaptive.getFilter().filter(newText);
return false;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
}
搜索菜單.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- item for our search view with its id -->
<item
android:id="@+id/actionSearch"
android:icon="@drawable/ic_baseline_search_24"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView" />
</menu>
問題是當我單擊工具欄上的搜索圖標並輸入內容時,過濾器有效
但是 recyclerview 中的結果有不同的名稱。 但是當我點擊它時
吐司出現,正確的名稱在吐司上,在recyclerview中是別的東西。
我可以解決我的問題。 問題出在我的 recyclerview 適配器中。
這是更新后的 CustomAdapter:
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyviewHolder> implements Filterable {
Context co;
List<Items> mylist;
List<Items> copy;
public CustomAdapter(List<Items> mylist, Context co) {
this.mylist = mylist;
copy=new ArrayList<>(mylist);
this.co = co;
}
@NonNull
@Override
public CustomAdapter.MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyviewHolder(ListItemsBinding.inflate(LayoutInflater.from(co),parent,false));
}
@Override
public void onBindViewHolder(@NonNull CustomAdapter.MyviewHolder holder, int position) {
Items item = mylist.get(position);
holder.itembind.text.setText(item.getName());
}
@Override
public int getItemCount() {
return mylist.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public Filter getFilter() {
return exampleFilter;
}
private final Filter exampleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Items> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(copy);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Items item : copy) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mylist.clear();
mylist.addAll((List) results.values);
notifyDataSetChanged();
}
};
public class MyviewHolder extends RecyclerView.ViewHolder {
private ListItemsBinding itembind;
public MyviewHolder(ListItemsBinding itembind) {
super(itembind.getRoot());
this.itembind=itembind;
itembind.const1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(co,""+mylist.get(getAdapterPosition()).getName(),Toast.LENGTH_SHORT).show();
}
});
}
}
}
我希望這將有助於將來的某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.