2016-05-23 8 views
0

Ich verwende RecyclerView (und GridLayout), um dynamische Schaltflächen in einem Raster zu platzieren. Was ist der beste Weg, um einen unterschiedlichen onClickListener für jede dynamische Schaltfläche einzurichten, wie sie mit RecyclerView erstellt und im Gridlayout platziert wird?Verschiedene onClickListeners für dynamische Schaltflächen mit RecyclerView

Meine Schaltflächen werden nach dem Zufallsprinzip erstellt, abhängig von einer Benutzeraktion, indem Sie einen Drawable an meine RecyclerView in der Methode "createButton" weiterleiten. Nur ein Zeichen wird zu einem Zeitpunkt an mein GridLayout übergeben und jedes Mal muss ein neuer onClickListener erstellt werden. Was ist der beste Weg, dies zu tun?

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)); 
} 

Antwort

1

Ich glaube nicht, dass Sie einen neuen Klick Zuhörer brauchen jedes Mal, wenn Sie nur einen Klick Zuhörer brauchen, die die ItemObject bewusst ist. Dafür gebe ich Ihnen meine übliche Ansatz für ein solches Muster:

Irgendwo in Ihrem Code Sie haben eine RecyclerView.ViewHolder, sollten Sie diese Ansicht Halter machen OnClickListener implementieren und geben die Referenz von ItemObject an dem Halter während OnBind passieren, wie folgt vor:

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 
    } 

} 

und dann während onBind müssen Sie die ItemObject

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

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

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

} 
+0

Dank richtig eingestellt! Ich wusste von diesem Ansatz, wusste aber nicht, dass es in der Lage wäre, für jede andere Schaltfläche einen anderen onClickListener zu setzen. Ich habe mich gefragt, ob Sie auch wissen, wie man "context" an "MyHolder" (in dem Code, den Sie gaben) weitergibt. Da mein onClickListener eine andere Aktivität öffnet, muss ich "getApplicationContext" verwenden. Weißt du wie das geht? – Natalie

+0

@Natalie jede Ansicht hat eine Methode 'getContext()' Sie erhalten die angeklickte Ansicht während 'onClick'. – Budius

+0

Ja, ich verstehe. Ich erkannte, dass ich "view.getContext" verwenden kann, um Kontext in onClick zu verwenden. Vielen Dank! – Natalie