2016-07-07 21 views
5

Próbuję otrzymywać kliknięcia na pozycje RecyclerView, dla których używam mechanizmu zwrotnego. Stworzyłem interfejs OnItemClickListener i niestandardowy adapter, napisałem logikę do wykrywania kliknięć z pomocą View.OnClickListener. Ale otrzymuję wywołanie zwrotne w myActivity po dwukrotnym kliknięciu dowolnego elementu na liście. Nie mam pojęcia, co się tutaj dzieje!RecyclerView pojedyncze kliknięcie nie działa, ale działa po dwukrotnym kliknięciu

Kod wewnątrz Aktywny:

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

Kod interfejsu:

public interface OnItemClickListener { 

    void onItemClick(View v, int position); 
} 

Code for Custom Adapter:

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 metoda jest wykonywana na jednym kliknięciem? –

+0

Przepraszam !! ale nie dostałam ciebie – nlogn

+0

mam na myśli dodać log w środku onClick metody 'view.setOnClickListener' i sprawdzić czy dzwoni za każdym razem lub tylko na podwójne kliknięcie –

Odpowiedz

1

Dodaj click-słuchacza w ItemViewHolder, to działa dobrze.

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

Najedź onClickListner z onCreateViewHolder do 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

Wystarczy przesunąć kursor onClick w onBindViewHolder i ustawić kliknij poniżej, nadzieję, że to rozwiąże problem ....

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

Ten problem był związany z Androidem: focusable = "true" w moim layoucie, ponieważ usunąłem go, działało dobrze, wszystkie sugerowane odpowiedzi również działają poprawnie. Dzięki, wszystkim.

0

Dodaj je do elementu nadrzędnego R.layout.item_app_list

android:clickable="false" 
android:focusable="false" 
Powiązane problemy