2017-04-08 19 views
1

RecyclerViewアイテムがクリックされたときに通知されるように、メインアクティビティに実装するカスタムリスナを持つRecyclerViewがあります。RecyclerViewアダプタのカスタムリスナーインターフェイス

ただし、setMyAdapterListenerをアダプタに入れる場所がわかりません。どこに置く?

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private Context context; 

    private List<Data> data; 

    private MyAdapterListener myAdapterListener; 

    public MyAdapter(Context context, List<Object> data) { 
     this.context = context; 
     this.data = data; 
    } 

    public interface MyAdapterListener { 
     void onContainerClick(); 
    } 

    public void setMyAdapterListener(MyAdapterListener myAdapterListener) { 
     this.myAdapterListener = myAdapterListener; 
    } 

    public class ViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public LinearLayout container; 

     public ImageView poster; 

     public ViewHolderItem(View v) { 
      super(v); 

      container = (LinearLayout) v.findViewById(R.id.container); 

      poster = (ImageView) v.findViewById(R.id.poster); 
     } 

     @Override 
     public void onClick(View v) { 
      int id = v.getId(); 

      if (id == R.id.container) { 
       if (myAdapterListener != null) { 
        myAdapterListener.onContainerClick(); 
       } 
      } 
     } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder viewHolder = null; 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

     View v2 = inflater.inflate(R.layout.item_layout, parent, false); 
     viewHolder = new ViewHolderItem(v2); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Data item = (Data) data.get(position); 

     holder.poster.setImageDrawable(someDrawable); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

} 

答えて

1

(setMyAdapterを削除)だけで以下を参照、現在お使いのrecyclerviewのアダプタコンストラクタの一部としてsetMyAdapterListenerを持っている引数を渡す:あなたの活動に

public MyAdapter(Context context, List<Object> data, MyAdapterListener myAdapterListener) { 
     this.context = context; 
     this.data = data; 
     this.myAdapterListener = myAdapterListener; 
    } 

//をあなたが実装する必要がありますあなたのインターフェイスのメソッド。

0

@ScottSあなたはsetMyAdapter()メソッドを必要としないと言っていますが、onclickリスナーInterfaceクラスをアダプタコンストラクタの引数として渡してから、アクティビティクラス..のインターフェイスメソッドを実装してください。

mAdapter = new MyAdapter(getApplicationContext() , data, new MyAdapter.MyAdapterListener() { 
 
        @Override 
 
        public void onContainerClick(View v, int position) { 
 
         Log.d(TAG, "iconTextViewOnClick at position "+position); 
 
        } 
 

 
       }); 
 
mRecycler.setAdapter(mAdapter);

public MyAdapter(Context context, List<Object> data) { 
 
     this.context = context; 
 
     this.data = data; 
 
      this.myAdapterListener = myAdapterListener; 
 
    } 
 
    
 
    public interface MyAdapterListener { 
 
    void onContainerClick(); // please provide 2 parameter that will help you more for manipulation like shown below 
 
/// void onContainerClick(View view, int position); 
 
} 
 

 
} 
 

 
public class ViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener { 
 
    public LinearLayout container; 
 

 
    public ImageView poster; 
 

 
    public ViewHolderItem(View v) { 
 
     super(v); 
 

 
     container = (LinearLayout) v.findViewById(R.id.container); 
 

 
     poster = (ImageView) v.findViewById(R.id.poster); 
 

 
     container =setOnClickListener(this); /// this line must include 
 
    } 
 

 
    @Override 
 
    public void onClick(View v) { 
 
     int id = v.getId(); 
 

 
     if (id == R.id.container) { 
 
      if (myAdapterListener != null) { 
 
       myAdapterListener.onContainerClick(); 
 
       // myAdapterListener.onContainerClick(v,getAdapterPosition()); 
 
      } 
 
     } 
 
    } 
 
}

は、次に、あなたのRecyclerViewが使用されているあなたの活動やどこのイベントを処理することができます

関連する問題