我需要根据一个实现搜索功能EditText
,以我的RecyclerView
。键入时必须过滤列表。
这是代码:
DisplayAdapter.java,这是适配器
public class DisplayAdapter extends RecyclerView.Adapter<DisplayAdapter.MyViewHolder>{
private List<DataHolder> displayedList;
public class MyViewHolder extends RecyclerView.ViewHolder{
public TextView english_d;
public MyViewHolder(View view){
super(view);
english_d = (TextView) view.findViewById(R.id.engword);
}
}
public DisplayAdapter(List<DataHolder> displayedList){
this.displayedList = displayedList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int position) {
// create a layout
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
DataHolder content = displayedList.get(position);
holder.english_d.setText(content.getEnglish());
}
@Override
public int getItemCount() {
return displayedList.size();
}
}
DataHolder.java
public class DataHolder {
private String english;
public DataHolder() {
}
public DataHolder(String english, String german) {
this.english = english;
}
public String getEnglish() {
return english;
}
public void setEnglish(String english) {
this.english = english;
}
}
这是我正在使用的片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_two_fragment, container, false);
rv = (RecyclerView) view.findViewById(R.id.list_view_english);
rv.setHasFixedSize(true);
inputSearch = (EditText) view.findViewById(R.id.inputSearch);
rv.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL));
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
rv.setLayoutManager(layoutManager);
DisplayContent();
disp_adapter = new DisplayAdapter(displayedList);
rv.setAdapter(disp_adapter);
return view;
}
在你的适配器中添加新功能以更新列表
public void updateList(List<DataHolder> list){
displayedList = list;
notifyDataSetChanged();
}
添加textWatcher进行搜索可以说你正在使用Edittext作为搜索字段
searchField.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// filter your list from your input
filter(s.toString());
//you can use runnable postDelayed like 500 ms to delay search text
}
});
简单的过滤功能
void filter(String text){
List<DataHolder> temp = new ArrayList();
for(DataHolder d: displayedList){
//or use .equal(text) with you want equal match
//use .toLowerCase() for better matches
if(d.getEnglish().contains(text)){
temp.add(d);
}
}
//update recyclerview
disp_adapter.updateList(temp);
}
和牛刀
@OnTextChanged(R.id.feature_manager_search)
protected void onTextChanged(CharSequence text) {
filter(text.toString());
}
if(d.getEnglish().equal(text)){ temp.add(d); }
改成if(d.getEnglish().contains(text)){ temp.add(d); }
谢谢花花公子工作得很好,只是d.getName()。toLowerCase()。contains(text.toLowerCase())会得到清晰的结果,谢谢
这是工作。[ stackoverflow.com/users/3319074/zeroone](@ZeroOne)
这很棒。但是我只是想知道这种方法是有效的还是使用Filterable是有效的。但是,我也没有看到这种方法的任何后撤。谢谢
完美无瑕。像魅力一样运作,非常感谢