2016-07-07 34 views
5

Sto tentando di ricevere clic sugli articoli RecyclerView per i quali sto utilizzando il meccanismo di callback. Ho creato l'interfaccia OnItemClickListener e l'adattatore personalizzato interno, ho scritto la logica per rilevare il clic con l'aiuto di View.OnClickListener. Ma ricevo una richiamata in myActivity dopo aver fatto doppio clic su un elemento nell'elenco. Non ho idea di cosa sta succedendo qui!RecyclerView singolo clic non funziona ma funziona quando si fa clic due volte

codice all'interno di attività:

mAdapter = new AppAdapter(this, mAppList, new OnItemClickListener() { 
     @Override 
     public void onItemClick(View v, int position) { 

      Toast.makeText(SelectAppActivity.this, "Hello", Toast.LENGTH_SHORT).show(); 
     } 
}); 

recyclerview.setAdapter(mAdapter); 

Codice per l'interfaccia:

public interface OnItemClickListener { 

    void onItemClick(View v, int position); 
} 

Codice per Custom Adattatore:

public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ItemViewHolder> { 

    List<App> mAppList; 
    List<App> mFilterAppList; 
    Activity context; 
    OnItemClickListener onItemClickListener; 

    public AppAdapter(Activity context, List<App> appList, OnItemClickListener onItemClickListener) { 
     super(); 
     this.context = context; 
     this.mAppList = appList; 
     this.mFilterAppList = appList; 
     this.onItemClickListener = onItemClickListener; 
    } 

    @Override 
    public ItemViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
     final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_list, parent, false); 

     final ItemViewHolder viewHolder = new ItemViewHolder(view); 

     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onItemClickListener.onItemClick(v,4); 
      } 
     }); 
     return viewHolder; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public void onBindViewHolder(ItemViewHolder holder, int position) { 
     final App app = mAppList.get(position); 
     holder.name.setText(app.getmName()); 
     holder.icon.setImageDrawable(app.getmAppIcon()); 
    } 

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

    public void setFilter(List<App> appList) { 
     mAppList = new ArrayList<>(); 
     mAppList.addAll(appList); 
     notifyDataSetChanged(); 
    } 

    public static class ItemViewHolder extends RecyclerView.ViewHolder { 

     public TextView name; 
     public ImageView icon; 

     public ItemViewHolder(View view) { 
      super(view); 
      name = (TextView) itemView.findViewById(R.id.app_name); 
      icon = (ImageView) itemView.findViewById(R.id.app_icon); 
     } 
    } 
} 
+0

'' onClick viene eseguito su solo click? –

+0

scusate !! ma non ti ho preso – nlogn

+0

intendo aggiungere un log nel metodo onClick di 'view.setOnClickListener' e controllare che stia chiamando ogni volta o solo doppio click –

risposta

1

Aggiungere il Click-ascoltatore in ItemViewHolder, funziona benissimo.

public static class ItemViewHolder extends RecyclerView.ViewHolder { 

    public TextView name; 
    public ImageView icon; 

    public ItemViewHolder(View view) { 
     super(view); 
     name = (TextView) itemView.findViewById(R.id.app_name); 
     icon = (ImageView) itemView.findViewById(R.id.app_icon); 

     view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //getLayoutPosition is a method of RecyclerView 
      onItemClickListener.onItemClick(v,getLayoutPosition()); 
     } 
    }); 

    } 

} 
1

Spostare l'onClickListner da onCreateViewHolder a onBindViewHolder

@Override 
    public void onBindViewHolder(ItemViewHolder holder, int position) { 
     final App app = mAppList.get(position); 
     holder.name.setText(app.getmName()); 
     holder.icon.setImageDrawable(app.getmAppIcon()); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
      public void onClick(View v) { 
       onItemClickListener.onItemClick(v , position); 
      } 
     }); 

    } 
1

Basta muovere l'onClick in onBindViewHolder e impostare clic, come di seguito, Spero che sarà risolvere il problema ....

holder.icon.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    onItemClickListener.onItemClick(v,4); 
    } 
}); 
7

Il problema era relativo ad Android: focusable = "true" nel mio layout, mentre rimuovevo tutto ciò funzionava bene, anche tutte le risposte suggerite funzionano bene. Grazie, tutto.

0

Aggiungere questi al vostro elemento padre di R.layout.item_app_list

android:clickable="false" 
android:focusable="false" 
metodo
Problemi correlati