2016-05-23 11 views
0

RecyclerView(およびGridLayout)を使用してグリッドに動的ボタンを配置しています。 RecyclerViewを使用して作成され、Gridlayoutに配置されるときに、各ダイナミックボタンに異なるonClickListenerを設定する最も良い方法は何ですか?RecyclerViewを使用する動的ボタンの異なるonClickListeners

私のボタンは、下のメソッド "createButton"のRecyclerViewにドロウアブルを渡すことで、ユーザアクションに応じてランダムに作成されます。一度に1つのdrawableだけがmyLayoutに渡され、新しいonClickListenerを作成する必要があります。これについて最善の方法は何ですか?

private GridLayoutManager lLayout; 
RecyclerViewAdapter rcAdapter; 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    List<ItemObject> myList = new ArrayList<>(); 
    rcAdapter = new RecyclerViewAdapter(getActivity(),myList); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.home_fragment, container, false); 

    lLayout = new GridLayoutManager(getActivity(), 3, 
      GridLayoutManager.HORIZONTAL, false); 

    RecyclerView rView = (RecyclerView)view.findViewById(R.id.recycler_view); 

    rView.setHasFixedSize(true); 
    rView.setLayoutManager(lLayout); 
    rView.setAdapter(rcAdapter); 
    return view; 
} 

public void createButton (Drawable d, String appName){ 
    rcAdapter.addItem(new ItemObject(appName, d)); 
} 

答えて

1

私はあなたが新しいクリックリスナーにあなただけのItemObjectを認識しているクリックリスナーを必要とするたびに必要とは思いません。そのために、私はあなたにこのようなパターンのための私のいつものアプローチをあげる:あなたのコード内

どこかにあなたがRecyclerView.ViewHolderを持っている、あなたは、そのビューの所有者がOnClickListenerを実装し、OnBind中にホルダーにItemObjectの参照を渡す与える行う必要があります次のように:

class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    ItemObject itemObject; 

    public MyHolder(View itemView) { 
     super(itemView); 
     itemView.findViewById(your button Id).setOnClickListener(this); // make this holder receives the clicks 
    } 

    @Override 
    public void onClick(View view) { 
     // here you add logic that depending on the data from itemObject 
    } 

} 

、次に[OnBind]の中に、あなたは正しくItemObject

@Override 
public void onBindViewHolder (MyHolder holder, int position) { 

    ItemObject itemObject = list.get(position); 
    holder.itemObject = itemObject; 

    // the rest of your bind code.... 

} 
+0

感謝を設定する必要があります!私はそのアプローチを知っていましたが、ボタンごとに異なるonClickListenerを設定できることはわかりませんでした。あなたが "コンテキスト"を "MyHolder"(あなたが与えたコード)に渡す方法も知っているのだろうかと思っていました。私のonClickListenerは別のアクティビティを開いているので、 "getApplicationContext"を使う必要があるからです。あなたはこれを行う方法を知っていますか? – Natalie

+0

@Natalieすべてのビューに 'getContext()'メソッドがあります。これは、 'onClick'の間にクリックされたビューを受け取ります。 – Budius

+0

はい、あります。私は "view.getContext"を使用してonClickのコンテキストを使用できることに気付きました。ありがとう! – Natalie

関連する問題