【问题标题】:RecyclerView not updating dynamically on searchRecyclerView 不会在搜索时动态更新
【发布时间】:2021-02-17 13:21:37
【问题描述】:

我有一个包含航班信息的回收站视图,我正在使用搜索栏上的航班号进行搜索。当我搜索时,recyclerview 会动态更新,逻辑在我的过滤器函数中,但是当我清除搜索时,recycler 视图是完全空的。我该如何解决这个问题?

搜索过滤功能

private void filter(String text) {
     ArrayList<FlightItem> filteredList = new ArrayList<>();

     for(FlightItem item : flightItems) {
         if(item.getFlightNumber().toLowerCase().contains(text.toLowerCase())){
             filteredList.add(item);
          }
     }
     mAdapter.filterList(filteredList);
     flightItems.clear();
     flightItems.addAll(filteredList);
   }
}

【问题讨论】:

  • 可以找到搜索实现here
  • 用于 notifyDataSetChanged();在适配器中添加更新列表后。
  • 我已经这样做了,但问题仍然存在
  • public void filterList(ArrayList&lt;FlightItem&gt; filteredList) { flightlist = filteredList; notifyDataSetChanged(); }
  • @SurenderKumar 是针对listview的,这里我用的是RecyclerView,问题不一样

标签: java android android-recyclerview android-search


【解决方案1】:

保留flightItems 的副本,因为您在添加过滤项目之前将其清除

ArrayList<FlightItem> flightItems = new ArrayList<>();
ArrayList<FlightItem> flightItemsCopy = new ArrayList<>();

private void filter(String text) {
     if(text.trim() == ""){
        clearSearch()
        return
     }
     ArrayList<FlightItem> filteredList = new ArrayList<>();

     for(FlightItem item : flightItems) {
         if(item.getFlightNumber().toLowerCase().contains(text.toLowerCase())){
             filteredList.add(item);
          }
     }
     flightItemsCopy.clear(); //clear copy
     flightItemsCopy.addAll(flightItems); // make a copy here
     mAdapter.filterList(filteredList);
     flightItems.clear();
     flightItems.addAll(filteredList);
   }
}

private void clearSearch(){
    flightItems.clear();
    flightItems.addAll(flightItemsCopy);
    mAdapter.notifyDataSetChanged();
}

【讨论】:

  • 当过滤方法中的文本为空时,我已经更新了代码
  • 我在哪里可以保存 flightItems 的副本?
  • 你的 flightItems,主要是一个全局变量
  • 在这种情况下,无论我在我的活动中使用 flightItems 的任何地方,我都需要为 flightItemsCopy 复制它,这样会不会真的效率低下?
  • 如果您能在这里帮助我,我将不胜感激
【解决方案2】:
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);

}

updateList 方法:

public void updateList(List<DataHolder> list){
 displayedList = list;
 notifyDataSetChanged();

}

【讨论】:

  • 我已经这样做了,搜索后点击它没有得到正确的位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2016-07-14
相关资源
最近更新 更多