677 Stimmen

RecyclerView onClick

Hat jemand, der RecyclerView verwendet, einen Weg gefunden, um einen onClickListener für Elemente im RecyclerView festzulegen? Ich dachte daran, für jedes Element einen Listener für jedes Layout festzulegen, aber das scheint etwas zu umständlich zu sein. Ich bin sicher, dass es eine Möglichkeit gibt, dass der RecyclerView auf das onClick-Ereignis hört, aber ich kann es nicht ganz herausfinden.

7voto

Chathura Jayanath Punkte 609

Ich habe eine leichte Bibliothek für Android entwickelt, die du auf GitHub besuchen und diesem Beispiel folgen kannst:

RecycleClick.addTo(DEIN_RECYCLE_VIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
        // Dein Code hier
    }
});

7voto

savepopulation Punkte 11248

Sie können View.OnClickListener implementieren zu Ihrer ViewHolder Klasse.

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public Item item;
    @InjectView(R.id.tv_title) 
    public TextView tvTitle;
    @InjectView(R.id.rl_row) 
    public RelativeLayout rlRow;

    public ViewHolder(View v) {
        super(v);
        ButterKnife.inject(this, v);
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Log.e("item title",item.getTitle());
    }
}

Und onBindViewHolder setzen Sie das Item Ihres ViewHolders:

public void onBindViewHolder(ViewHolder holder, int position) {
    holder.tvTitle.setText(objects.get(position).getTitle());
    holder.item = objects.get(position);
}

6voto

Arash Hatami Punkte 4731

Sie können ganz einfach setOnClickListener in Ihrer ViewHolder-Klasse wie folgt definieren:

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView product_name;

    ViewHolder(View itemView) {
        super(itemView);
        product_name = (TextView) itemView.findViewById(R.id.product_name);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int itemPosition = getLayoutPosition();
                Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

6voto

Jawnnypoo Punkte 993

Alle bisher geposteten Antworten sind großartige Lösungen. Wenn Sie jedoch nicht zu viele Implementierungsdetails behandeln möchten und einfach möchten, dass es ähnlich wie ListView funktioniert, empfehle ich die Verwendung von TwoWay-View, wie hier zu sehen:

https://github.com/lucasr/twoway-view

Beachten Sie, dass diese Implementierung auch die lange Druckfunktion auf Elemente unterstützt sowie Unterstützung für gedrückte Zustände bietet (was eine wichtige Sache ist, die anderen Lösungen zu dieser Frage fehlt).

Wenn Sie nicht die gesamte Bibliothek verwenden möchten, werfen Sie einen Blick auf die ClickItemTouchListener-Klasse, die bei Bedarf eigenständig verwendet werden kann. Das einzige Problem, das ich derzeit damit gefunden habe, ist mit langer Druck + Scrollen, es scheint ein falsches Verhalten zu haben.

5voto

xurxodev Punkte 1451

Der RecyclerView hat kein OnClickListener und muss von uns selbst implementiert werden.

Ich füge eine OnItemClickListener-Schnittstelle im Adapter hinzu mit einer onClick-Methode, die aufgerufen wird, wenn Sie auf die Elementansicht vom ViewHolder klicken. So liegt die Verantwortung für das Klicken auf einem Element außerhalb des ViewHolder und des Adapters. Die Aktivität oder das Fragment entscheiden dann, was zu tun ist

Fügen Sie eine Schnittstelle zum Zuhörer und dem Zuhörerobjekt hinzu.

public class ItemsAdapter extends RecyclerView.Adapter {

  ...

  private static OnItemClickListener onItemClickListener;

  ...

  public static interface OnItemClickListener {
      public void onItemClick(View view, int position);
  }

  ...
}

Wir erfassen das Klicken auf die Root-Ansicht des Elements und wenn das Callback ausgelöst wird, rufen wir den onClick-Listener im Adapter auf.

public class ItemsAdapter extends RecyclerView.Adapter {

  ...

  private static OnItemClickListener onItemClickListener;

  ...

  public static interface OnItemClickListener {
      public void onItemClick(View view, int position);
  }

  ...

  public static class ViewHolder extends RecyclerView.ViewHolder {
      public ImageView imageView;

      public ViewHolder(View itemRootView) {
          super(itemRootView);
          imageView = (ImageView) itemRootView.findViewById(R.id.itemImage);

          itemRootView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  int position  = ViewHolder.super.getAdapterPosition();
                  onItemClickListener.onItemClick(view,position);
              }
          });
      }
  }
}

Da die Aktivität oder das Fragment, in unserem Fall das Fragment, weisen wir dem Adapter einen Zuhörer zu und wenn das onClick-Callback aufgerufen wird, erhalten wir das ausgewählte Element nach Position und öffnen eine detaillierte Aktivität des Elements.

public class ItemsFragment extends Fragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       ...    
        ((ItemsAdapter) adapter).setOnItemClickListener(new ItemsAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //Machen Sie etwas, wenn ein Element angeklickt wurde
            }
        });
        ...
    }
...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X