2016-04-04 9 views
1

モデル自体を渡す:正しい方法はrecycleViewの行をクリックを実装する - 私はrecycleView行のクリックを実装する方法についてStackOverflowの上のいくつかの回答を読み、このバージョンで終わった

ViewHolder:

public class ContactViewHolder extends RecyclerView.ViewHolder { 

    private final TextView text_name; 
    private final IContactClick listener; 

    public ContactViewHolder(View itemView, IContactClick _listener) { 
     super(itemView); 

     text_name = (TextView) itemView.findViewById(R.id.text_name); 
     listener = _listener; 
    } 

    public void bind(final Contact model) { 
     text_name.setText(model.name); 

     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       listener.contactClick(model); 
      } 
     }); 
    } 

    public interface IContactClick { 
     void contactClick(Contact contact); 
    } 
} 

Adaptar:

public class ContactsAdapter extends RecyclerView.Adapter<ContactViewHolder> implements ContactViewHolder.IContactClick{ 

private final LayoutInflater mInflater; 
private final List<Contact> mModels; 

public ContactsAdapter(Context context, List<Contact> models) { 
    mInflater = LayoutInflater.from(context); 
    mModels = new ArrayList<>(models); 
} 

public void contactClick(Contact contact) { 
    Log.d("contactClick", contact.name); 
} 
... 

私は、コールバック内で使用することができますので、最終的にモデルを変更する必要がありました。これはうまくいくようです。私はこれが良い習慣であるかどうか、動いているのだろうかと思います。

乾杯

+0

は継続全く問題ありません。あなたは内部クラスから評価される最終的な宣言をする必要があります。 –

答えて

0

私はRecyclerViewで働いていないが、私はこのアプローチは、同様ListViewに適用されると思います。私はこの方法で私のListAdapterを実装しています。何とかそれはデカップリングの感覚を与えるからです。たとえば、同じAdapterを複数のListView/RecyclerViewに使用する場合(同じ行表示/異なるクリック動作など)、このアプローチを使用できます。

PS:私は、上記の構成のための1つのユースケースを見つけるために、まだだ、まだ私はデカップリングが私に優位性を与えることを考えたいです。

パッシングモデル自体(したがって、それは、最終的な作り)についてのあなたの懸念については、私はそれが今まで問題ではないと思います。私はそのように実装された多くのListViewを持っています。 RecyclerViewが単純な場合は、positionをクリックハンドラに渡し、Fragment/ActivityAdapter#getItem(position)と呼び出してモデルを取得することができます。

関連する問題