我有一个带有工具栏的活动,我正在调用包含recyclerview的片段,在工具栏中有搜索选项,当我用文本搜索时,应该过滤recyclelerview。请帮帮我。
这是我的代码 在Activity我有工具栏 -
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)
MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(new
SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
System.out.println("Clicked...");
search = newText;
return false;
}
});
System.out.println("Item : "+item);
return true;
}
在Fragment中我有recyclerview,它设置了适配器
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyRecyclerViewAdapter(results);
}
在MyRecyclerViewAdapter中 -
public class MyRecyclerViewAdapter extends RecyclerView
.Adapter<MyRecyclerViewAdapter
.DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
public static ArrayList<DataObject> mDataset;
public static ArrayList<DataObject> mFilteredList;
private static MyClickListener myClickListener;
View view;
public class DataObjectHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, Filterable {
ImageView img;
TextView label;
ImageView img_navi;
TextView txt_add;
TextView txt_id;
TextView txt_desc;
ImageView img1;
TextView name;
TextView title_desc;
CircularImageView profile_img;
public DataObjectHolder(View itemView) {
super(itemView);
img = (ImageView)itemView.findViewById(R.id.img);
label = (TextView) itemView.findViewById(R.id.txt_issues);
img_navi = (ImageView) itemView.findViewById(R.id.img_navi);
txt_add = (TextView)itemView.findViewById(R.id.txt_add);
txt_id = (TextView)itemView.findViewById(R.id.txt_id);
txt_desc = (TextView)itemView.findViewById(R.id.txt_desc);
img1 = (ImageView) itemView.findViewById(R.id.img1);
name = (TextView)itemView.findViewById(R.id.txt_name);
profile_img = (CircularImageView)
itemView.findViewById(R.id.img_pic);
title_desc = (TextView)itemView.findViewById(R.id.title_desc);
Log.i(LOG_TAG, "Adding Listener");
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence
charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = mDataset;
} else {
ArrayList<DataObject> filteredList = new ArrayList<>();
for (DataObject dataObject : mDataset) {
if (dataObject.getmText1().toLowerCase().contains(charString) || dataObject.getmText2().toLowerCase().contains(charString) || dataObject.getmText3().toLowerCase().contains(charString) || dataObject.getmText4().toLowerCase().contains(charString) || dataObject.getmText5().toLowerCase().contains(charString)|| dataObject.getmText6().toLowerCase().contains(charString)) {
filteredList.add(dataObject);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (ArrayList<DataObject>) filterResults.values;
notifyDataSetChanged();
}
};
}
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public MyRecyclerViewAdapter(ArrayList<DataObject> myDataset) {
mDataset = myDataset;
mFilteredList = myDataset;
}
@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
if(MyComplaintsFragment.my_complaints == true){
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view_row1, parent, false);
}
else {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view_row, parent, false);
}
DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
holder.img.setImageResource(R.drawable.play);
holder.label.setText(mDataset.get(position).getmText6());
holder.img_navi.setImageResource(R.drawable.navigation);
holder.txt_add.setText(mDataset.get(position).getmText2());
holder.txt_id.setText(mDataset.get(position).getmText3());
holder.txt_desc.setText(mDataset.get(position).getmText4());
holder.name.setText(mDataset.get(position).getmText5());
holder.title_desc.setText(mDataset.get(position).getmText1());
holder.img1.setImageResource(R.drawable.i1);
}
public void addItem(DataObject dataObj, int index) {
mDataset.add(index, dataObj);
notifyItemInserted(index);
}
public void deleteItem(int index) {
mDataset.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return mDataset.size();
}
public interface MyClickListener {
public void onItemClick(int position, View v);
}
}
如何使用适配器中的getFilter
谢谢
答案 0 :(得分:0)
您主要关心的是如何与search view
交流fargment
?可以将活动searchView
中的toolbar
与与您的adapter
相关的fragment
进行通信。
fragment
个所需片段的实例(有适配器)fragment
中创建一个方法,例如addSearch(String text)
,它将是公开的。您的onQueryTextChange
中的片段中的调用方法,例如:
if(fragmentInstance instanceOf YourFragment){ (((YourFragment)fragment).addSearch(queryText);}
现在您可以通过addSearch
方法调用适配器了