2017-04-11 84 views
1

喜后,我有一个RecyclerView适配器如下: -错误的项目筛选

public class RecyclerViewAdapter extends RecyclerView.Adapter<ViewHolder> { 

     List<Data> list = Collections.emptyList(); 
     Context context; 

     public RecyclerViewAdapter(List<Data> list, Context context) { 
      this.list = list; 
      this.context = context; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      //Inflate the layout, initialize the View Holder 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.apps_layout, parent, false); 

      ViewHolder holder = new ViewHolder(v); 
      return holder; 

     } 

    @Override 
    public void onViewDetachedFromWindow(ViewHolder holder) { 
     super.onViewDetachedFromWindow(holder); 

     ((ViewHolder)holder).itemView.clearAnimation(); 
    } 

    @Override 
     public void onBindViewHolder(ViewHolder holder, int position) { 

      //Use the provided View Holder on the onCreateViewHolder method to populate the current row on the RecyclerView 
      holder.title.setText(list.get(position).title); 
      holder.description.setText(list.get(position).description); 

     } 

    public void setFilter(List<Data> searched_data) { 
     list = new ArrayList<>(); 
     list.addAll(searched_data); 
     notifyDataSetChanged(); 
    } 

     @Override 
     public int getItemCount() { 
      //returns the number of elements the RecyclerView will display 
      return list.size(); 
     } 

     @Override 
     public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
      super.onAttachedToRecyclerView(recyclerView); 
     } 

     // Insert a new item to the RecyclerView on a predefined position 
     public void insert(int position, Data data) { 
      list.add(position, data); 
      notifyItemInserted(position); 
     } 

     // Remove a RecyclerView item containing a specified Data object 
     public void remove(Data data) { 
      int position = list.indexOf(data); 
      list.remove(position); 
      notifyItemRemoved(position); 
     } 

    } 

现在没事了,你可以看到使用setfilter方法来筛选recyclerview列表

这里我怎么称呼它

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String s) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String s) { 
       List<Data> filteredModelList = filter(data, s); 
       adapter.setFilter(filteredModelList); 
       return true; 
      } 
     }); 

现在,当我点击它过滤器的工作原理,现在罚款的位置是错误的

我知道从位置上点击老recyclerview来的误差有老位置索引我不知道如何反正修复它在这里是onclicklistener

data = appsdata(); // load the list List<Data> 

     Collections.sort(data); // sorting 

     recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
     final LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(layoutManager); 

     adapter = new RecyclerViewAdapter(data, this); 
     recyclerView.setAdapter(adapter); 
     recyclerView.setNestedScrollingEnabled(false); 

     recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, recyclerView, new RecyclerItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 

       String s = data.get(position).title; 
       String ss = data.get(position).description; 

       Intent intent = new Intent(MainAcitivity.this, Work.class); 
       intent.putExtra("title", s); 
       intent.putExtra("desc", ss); 
       startActivity(intent); 

      } 

     })); 

我知道这条线是造成问题

String s = data.get(position).title; 

,因为它是一样大的时候,并没有过滤名单,我怎么可以更新此recyclerview,这样我可以发动Work.class

回答

0

时得到更新索引的逻辑就在于你如何更新回收视图中的项目,

public void setFilter(List<Data> searched_data) { 
     list = new ArrayList<>(); 
     list.addAll(searched_data); 
     notifyDataSetChanged(); 
    } 

上面一行是没有必要的,adapter = new RecyclerViewAdapter(data, this);此行是了解非常重要。当您将数据传递到适配器时,您会看到您正在创建适配器和外部列表之间的符号链接。因此,对外部列表进行的任何更改都会更新适配器版本。每当对数据模型对象进行任何更改时,请致电adapter.notifyDatasetChange method 执行此操作。

改变从

List<Data> filteredModelList = filter(data, s); 
       adapter.setFilter(filteredModelList); 
       data = filteredModelList; // add this line 
       return true; 

以下,

adapter.list.clear(); 
    data = filter(data, s); 
    adapter.notifyDataSetChange(); 
+0

so setFilter(清单 Searches_data),不需要,在修改原始对象的适配器中,只需在修改后调用adapter.notifyDatasetChange(),即可。 – Remario

+0

这不会工作,或者由于我使用的列表仍然是旧的,因为我从该列表中获得位置,并且旧列表有 –

+0

只是试试它,是吗? – Remario

1

好男人该是什么在起作用部分对我来说

我试图通过添加更新数据列表

data = filteredModelList; // add this line 
过滤后

,这工作得很好

@Override 
      public boolean onQueryTextChange(String s) { 
       List<Data> filteredModelList = filter(data, s); 
       adapter.setFilter(filteredModelList); 
       data = filteredModelList; // add this line 
       return true; 
      } 

现在我得到真正的指数,但是当我搜索和清除列表,该列表是空的,因为我取代了数据列表:(

编辑: - 我通过破解修复它不是一个很好的方式,但作品

正如你可以看到旧列表已经不在编辑

当我用来改变数据列表

data = filteredModelList; // add this line 

那么新的数据列表只过滤值,当你明确的搜索查看然后将数据列表是空的,因为它不具备这些所有的应用程序列表我做了什么是,我提出了新的列表作为data_fix和onclicklistener我用来代替数据列表

怎么看这个

RecyclerItemClickListener方法

datafix

现在onsetfilter调用 我称这种

datafix = filteredModelList; // instead of data = filteredModelList; 

也是我的OnCreate初始化它,所以它是不启动应用程序的空由

data = appsdata(); // load the list List<Data> 
datafix = appsdata(); // load the list List<Data> added just below it to intialize 

现在这样的满载APPLIST //清单数据保持充满,即使你清除searchView和索引是没有问题的也没有清除

+0

因此在添加结束时recyclerview应该只包含仅更新的数据! – Remario

+0

我更新它看到我的答案它的工作原理,但不是一个很好的方式来做到这一点虽然 –

+0

有趣的问题给了你投票 – Remario