使用EditText筛选RecyclerView

问题描述:

我有这个应用程序,它从MySql数据库检索数据并将其解析为recyclerView。我有一个editText,我希望能够在输入时过滤recyclerView项目。使用EditText筛选RecyclerView

这里是我的MainActivity(SearchAvtivity):

public class SearchActivity extends AppCompatActivity { 
 
    private static final String TAG = "Search Activity"; 
 
    private Context mContext = SearchActivity.this; 
 
    private static final int ACTIVITY_NUM = 1; 
 

 
    String urlAddress = "myDatabaseAddressGoesHere.PHP"; 
 

 

 
    @Override 
 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_search); 
 
     Log.d(TAG, "onCreate: started"); 
 
     setupBottomNavigationView(); 
 
     final RecyclerView rv = (RecyclerView) findViewById(R.id.SearchRv); 
 
     rv.setLayoutManager(new LinearLayoutManager(this)); 
 
     rv.setItemAnimator(new DefaultItemAnimator()); 
 
     Downloader dl = new Downloader(SearchActivity.this,urlAddress,rv); 
 
     dl.execute(); 
 
    } 
 
      
 
      
 

 
    /** 
 
    * Setup Bottom Navigation View 
 
    */ 
 

 
    private void setupBottomNavigationView(){ 
 
     Log.d(TAG, "setupBottomNavigationView: Setting up Bottom Navigation View"); 
 
     BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx)findViewById(R.id.bottom_nav_bar); 
 
     BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx); 
 
     BottomNavigationViewHelper.enableNavigation(mContext,bottomNavigationViewEx); 
 
     Menu menu = bottomNavigationViewEx.getMenu(); 
 
     MenuItem menuItem = menu.getItem(ACTIVITY_NUM); 
 
     menuItem.setChecked(true); 
 

 
    } 
 
}

这里是MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyHolder> { 
 

 
    Context c; 
 
    ArrayList<SpaceCraft> spaceCrafts; 
 
    List<MyHolder> displayedList; 
 

 
    public MyAdapter(Context c, ArrayList<SpaceCraft> spaceCrafts) { 
 
     this.c = c; 
 
     this.spaceCrafts = spaceCrafts; 
 
    } 
 

 
    @Override 
 
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_adapter_vertical,parent,false); 
 
     return new MyHolder(v); 
 
    } 
 

 
    @Override 
 
    public void onBindViewHolder(MyHolder holder, int position) { 
 
     holder.nameTv.setText(spaceCrafts.get(position).getName()); 
 
     holder.addressTv.setText(spaceCrafts.get(position).getAddress()); 
 
     holder.phoneTv.setText(spaceCrafts.get(position).getPhone()); 
 
     holder.emailTv.setText(spaceCrafts.get(position).getEmail()); 
 

 
    } 
 

 
    @Override 
 
    public int getItemCount() { 
 
     return spaceCrafts.size(); 
 
    } 
 
}

伊不知道您是否需要查看下载器,解析器,连接器或持有者。我所以请告诉我。

+0

可能的重复[Android - 实现搜索过滤器到RecyclerView](https://stackoverflow.com/questions/40754174/android-implementing-search-filter-to-a-recyclerview) – Raghavendra

你可以在你的editText上使用TextWatcher来完成它,并在它内部过滤你的列表。

例子:

((EditText) findViewById(R.id.your_edit_text)).addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     String text = s.toString(); 
     ArrayList<String> yourCopyList = new ArrayList<>(yourList) 
     yourList.clear(); 
     if (text.isEmpty()) { 
      addAllYourDataToList(); 
     } else { 
      text = text.toLowerCase(); 
      for (int i = 0; i<yourCopyList.size(); i++) { 
       // Adapt the if for your usage 
       if (yourCopyList.get(i).getName().toLowerCase().contains(text)) { 
        yourList.add("the string"); 
       } 
      } 
     } 
     adapter.notifyDataSetChanged(); 
    } 
}); 

在这个例子中,你删除列表中的所有数据,并添加相应的只在文字过滤

+0

我应该在哪里添加这个textWatcher ? – abe

+0

这是你的editText((EditText)findViewById(R.id.your_edit_text))并在它上面添加一个addTextChangedListener()这个方法需要一个textwatcher参数。我想你的editText在你的Activity里面,所以把这段代码放在活动 – Vodet

+0

中,我按照你说的做了,但是在最后一部分“yourList.add(”the String)“我得到错误:add(***** ********* SpaceCract)ArrayList不能应用于(java.lang.string) – abe

的数据,你应该使用一个TextWatcher()对于RecyclerView。