2017-04-11 83 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