C'è un modo per impostare uno onClickListener
su un RecyclerView
?Come ottenere clic su RecyclerView (NON i bambini)
Ho un RecyclerView
con alcuni bambini al suo interno e l'impostazione di OnClickListener
sul genitore RecyclerView
. Tuttavia, lo onClick
non si attiva quando faccio clic su quella vista. Vedi il codice di esempio qui sotto - vogliamo ottenere clic sul genitore, NON i bambini. In questo scenario non ci interessano i clic sugli articoli.
Ho provato a fare setFocusable(false)
, setClickable(false)
e setOnClickListener(null)
sui bambini senza successo. In ogni caso, non penso che i bambini stiano rubando i clic dal genitore, perché quando clicco sull'area in cui non ci sono bambini, i clic non si registrano neanche.
package com.formagrid.hellotest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
public class HelloActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new RecyclerAdapter(Arrays.asList("hi", "this", "is", "some", "text"));
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("patricia", view.toString());
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> {
public class Holder extends RecyclerView.ViewHolder {
protected TextView textView;
public Holder(TextView itemView) {
super(itemView);
this.textView = itemView;
}
}
private List<String> contents;
public RecyclerAdapter(List<String> contents) {
this.contents = contents;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Holder(new TextView(parent.getContext()));
}
@Override
public void onBindViewHolder(Holder holder, int position) {
holder.textView.setText(contents.get(position));
}
@Override
public int getItemCount() {
return contents.size();
}
}
}
che potrebbe diventare peloso per noi. ti capita di sapere perché 'RecyclerView' non chiama mai 'performClick'? –
Beh, dovresti chiedere ai designer una risposta definitiva, ma IMO, è perché non è mai stato pensato per essere usato in quel modo. Di solito quando si presenta all'utente un elenco, si è più interessati all'interazione sui singoli elementi. Come potrebbe questo diventare peloso per te? Se sei preoccupato per il codice extra, puoi implementarlo in una sottoclasse 'RecyclerView', in modo da non inquinare il codice di 'Activity'. Oppure, se intendi che stai già utilizzando i gesti, questa funzionalità dovrebbe solo essere aggiunta a ciò che hai già. –
Se sei morto impostato sull'uso di 'OnClickListener', puoi eseguire la sottoclasse di' RecyclerView' per chiamare 'performClick()' stesso, ma dovrai monitorare gli eventi di tocco per distinguere tra un semplice clic e, ad esempio, trascinando, ma questo è fondamentalmente tutto il 'GestureDetector' sta facendo comunque. –