2014-07-03 16 views
10

Ho giocato un po 'con RecyclerView. C'è un modo semplice per inserire OnClickListener per gli articoli in RecyclerView? Ho provato a implementarlo in ViewHolder. L'evento onClick non è mai stato attivato.Sfide in RecyclerView di Android L

E ho utilizzato notifyItemInserted(position) per aggiungere nuovo valore a RecyclerView. L'interfaccia utente non viene aggiornata automaticamente. Necessario tirare su e giù per aggiornare. Ma quando invoco lo notifyDatasetChanged(..), è ok.

Ho applicato DefaultItemAnimator a RecyclerView. Ma, non vedendo alcuna animazione quando è stato aggiunto un nuovo elemento.

Grazie anticipo per qualsiasi idea.

Questo è il primo componente di Android L che ho provato e che sto stucchiando lì.

Qui è la mia classe di adattatori:

public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder> { 

private List<String> arrExperiences; 

//Provide a reference to the type of views that you are using - Custom ViewHolder 
public class MyViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvExperienceTitle; 
    public TextView tvExperienceDesc; 

    public MyViewHolder(RelativeLayout itemView) { 
     super(itemView); 
     tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title); 
     tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc); 
    } 

} 

//Provide a suitable constructor : depending on the kind of dataset. 
public AdapterRecyclerView(List<String> arrExperiences){ 
    this.arrExperiences = arrExperiences; 
} 

//Create new view : invoke by a Layout Manager 
@Override 
public AdapterRecyclerView.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_recycler, parent, false); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

@Override 
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) { 
    //get element from your dataset at this position. 
    //replace the content of the view with this element. 
    viewHolder.tvExperienceTitle.setText(arrExperiences.get(position)); 
} 

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

public void addExperience(String experience, int position){ 
    arrExperiences.add(position, experience); 
    notifyItemInserted(position); 
    //notifyDataSetChanged(); 
} 

public void removeExperience(){ 
    int index = (int) (Math.random() * arrExperiences.size()); 
    arrExperiences.remove(index); 
    notifyItemRemoved(index); 
    //notifyDataSetChanged(); 
} 
} 
+3

Si potrebbe provare https://gist.github.com/grantland/cd70814fe4ac369e3e92 – CommonsWare

+0

Questo è esattamente ho detto sopra. Quel ragazzo sta implementando OnClickListener da ViewHolder. L'ho provato. Ma l'evento onClick non è mai stato attivato. –

+0

Il suo codice chiama 'setOnClickListener()'. I tuoi dati sopra non lo fanno. – CommonsWare

risposta

0

Si prega di vedere la mia risposta here. Hai bisogno di una classe extra (che può essere inclusa come parte della versione completa) ma ti permetterà di creare OnItemClickListeners nel modo in cui sei abituato a ListViews.

0

Here si ottiene una semplice classe Adapter che può eseguire l'evento onItemClick su ogni riga di elenco per recyclerview.

0

Dal momento che non hai ancora contrassegnato la risposta corretta, e anche se è una vecchia domanda, cercherò di fornire il modo in cui faccio. Penso che sia molto pulito e professionale. Le funzionalità sono tratte da blog diversi (devo ancora menzionarli nella pagina), uniti e metodi sono stati migliorati per velocità e scalabilità, per tutte le attività che utilizzano un RecycleView.

https://github.com/davideas/FlexibleAdapter

  • Alla classe inferiore c'è SelectableAdapter che fornisce funzionalità di selezione ed è in grado di mantenere lo stato dopo la rotazione, è solo bisogno di chiamare i/OnRestore metodi OnSave dall'attività.
  • Quindi la classe FlexibleAdapter gestisce il contenuto con il supporto dell'animazione (chiamata notifica solo per la posizione Nota: è ancora necessario impostare l'animazione su RecyclerView quando viene creata l'attività).
  • Quindi è necessario estendere di nuovo questa classe. Qui si aggiungono e si implementano i metodi come si desidera per il proprio ViewHolder e la propria classe Dominio/Modello (titolare dei dati). Nota: Ho fornito un esempio che non viene compilato perché è necessario modificare le classi con quelle presenti nel progetto.

Credo che, è il ViewHolder che dovrebbe mantenere gli ascoltatori dei click e che dovrebbe essere fatto alla creazione e non nel metodo di rilegatura (che si chiama ad ogni invalida da comunicare ...()).

Si noti inoltre che questo adattatore gestisce i clic di base: scatti singoli e lunghe, se avete bisogno di un doppio tap è necessario utilizzare il modo Jabob Tabak does nella sua risposta.

Devo ancora migliorarlo, quindi tenetelo d'occhio. Voglio anche aggiungere alcune nuove funzionalità come l'Annulla.

1

Basta aggiungere questo nel vostro adattatore:

@Override 
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) { 
    yourItems.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //do your stuff 
     } 
    }); 
} 
Problemi correlati