2017-03-02 141 views
0

我需要從View Holder訪問RecyclerView適配器的方法。我沒有找到任何解決方案。從ViewHolder或ViewHolder的ViewModel訪問RecyclerView.Adapter的方法

還是有可能從ViewHolder的ViewModel類(我已經爲MVVM模式中的RecyclerView的項目定義了viewModel)訪問adpater'method(獲取適配器的實例)。

問候, 哈比卜

+0

你能請張貼相關的代碼片段? –

+0

創建適配器實現的接口並將適配器傳遞給接受該接口的Viewholder構造函數。 –

回答

1

感謝所有,這裏是代碼片段。在ItemViewModel類中,我想獲取適配器的方法。

適配器& & ViewHolder:

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> { 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     ........ 

     public MyViewHolder(View view) { 
      super(view); 
      ...... 
     } 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     return itemView;    
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
      ........ 
    } 

    @Override 
    public int getItemCount() { 
     ......... 
    } 
} 

list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 

<data> 
    <variable 
     name="viewModel" 
     type="program.viewmodel.ItemViewModel" /> 
</data> 

<android.support.v7.widget.CardView 
    android:id="@+id/cvMain" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:onClick="@{viewModel.onClickCard()}" 
    android:onLongClick="@{viewModel.onLongClickCard()}" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:paddingLeft="5dp"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/engM" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="left" 
       android:paddingLeft="5dp" 
       android:text="@{viewModel.engligh}" 
       android:textSize="20sp" /> 
     </LinearLayout> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

ItemViewModel類:

public class ItemViewModel{ 
    private Proverb proverb; //Proverb is model class 

    public ItemViewModel(Proverb item) { 
     this.proverb = item; 
     notifyChange(); 
    } 

    @Bindable 
    public String getEngligh() { 
     return proverb.getEngligh(); 
    } 

    /** 
    * click each item 
    * @return 
    */ 
    public View.OnClickListener onClickProverb() { 
     return new View.OnClickListener() { 
      @Override 
      public void onClick(View view) {    
       // here I need to access adapter's method    
      } 
     }; 
    } 

    /** 
    * long click listener  
    * @return 
    */ 
    public View.OnLongClickListener onLongClickProverb() { 
     return new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) {  
       // here I need to access adapter's method    
       return true; 
      } 
     }; 
    } 
}