2017-04-16 81 views
2

我有一個RecyclerView與多個項目視圖類型,所以他們被分成單獨的ViewHolder類。之前,當所有ViewHolders與RecyclerView適配器在同一個類中時,我可以在單擊或刪除項目時直接更新適配器。但是,我將ViewHolders分爲不同的類以更好地組織代碼。現在,我無法直接更新我的RecyclerView適配器。以下哪個解決方案是從我的ViewHolder與我的適配器通信的最佳方式?如果有比我列出的更好的解決方案,請建議!從Viewholder通知RecyclerView適配器的最佳方法是什麼?

  1. 對回調監聽器使用接口。請記住,可能有5 - 10種不同的視圖類型,所以這種方法需要5 - 10個接口?
    1. 使用事件總線庫,例如Greenrobot的Eventbus。

是一個接口或eventbus解決方案真的是最好的方法是什麼?在視圖和適配器之間進行通信肯定有更好的方法!

+0

你也可以使用數據綁定。 – BlackHatSamurai

回答

4

我通常在活動或片段中保存對適配器的引用。 ViewHolders可以作爲Adapter中的內部類或者作爲獨立包中的類來放置。您可以使用一個界面與視圖持有者進行交互。你只需要在你的活動或片段中實現它。例如:

public class MyAdapter extends RecyclerView.Adapter<VH> { 
    private MyInterface mInterface; 

    public MyAdapter(MyInterface i) { 
     mInterface = i; 
    } 

    //... some code to create view holders 


    //binding 
    @Override 
    protected void onBindItemViewHolder(ViewHolder viewHolder, final int position, int type) { 
     viewHolder.bindView(position, mInterface); //call methods of interface in bindView() methods of your viewHolders 
    } 

    interface MyInterface { 
     void someEvent(); 
    } 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    TextView mText; 

    ViewHolder(View root) { 
     super(root); 
     mText = (TextView)root.findViewById(R.id.text) 
    } 

    void bindView(int pos, MyAdapter.MyInterface myInterface) { 
     mText.setOnClickListener(v -> myInterface.someEvent()); 
     //...some other code 
    } 
} 
在活動或片段

而且地方:

final MyAdapter adapter = new MyAdapter(new MyAdapter.MyInterface() { 
    @Override 
    public void someEvent() { 
     adapter.notifyDataSetChanged(); 
    } 
}); 
+0

感謝您的建議和提供代碼位一起去!我將在稍後嘗試此操作,看看我是否可以在不會太麻煩的情況下使用多個查看者和事件。我會回覆並讓你知道它是怎麼回事! –

+0

此方法適用於適配器和視圖之間的交互。對於Viewholders和RecyclerView之間的交互,EventBus是一個更好的選擇。 –

相關問題