2016-07-07 29 views
5

Tôi đang cố gắng nhận các nhấp chuột vào RecyclerView các mục mà tôi đang sử dụng cơ chế gọi lại. Tôi đã tạo ra giao diện OnItemClickListener và bên trong Bộ điều hợp tùy chỉnh, tôi đã viết logic để phát hiện nhấp chuột với sự trợ giúp của View.OnClickListener. Nhưng tôi nhận được một cuộc gọi lại trong myActivity sau khi nhấp đúp vào bất kỳ mục nào trong danh sách. Không nhận được bất kỳ đầu mối gì đang xảy ra ở đây!RecyclerView nhấp chuột duy nhất không hoạt động nhưng hoạt động khi nhấp hai lần

Mã bên trong Hoạt động:

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

Mã Đối với Giao diện:

public interface OnItemClickListener { 

    void onItemClick(View v, int position); 
} 

Mã cho 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' phương pháp được thực thi trên nhấp chuột duy nhất? –

+0

xin lỗi !! nhưng không hiểu bạn – nlogn

+0

tôi có nghĩa là thêm nhật ký bên trong phương thức onClick của 'view.setOnClickListener' và kiểm tra xem nó có đang gọi mọi lúc hay chỉ trên nhấp đúp chuột –

Trả lời

1

Thêm Click-listener trong ItemViewHolder, nó hoạt động tốt.

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

Di chuyển onClickListner của bạn từ onCreateViewHolder để 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

Chỉ cần di chuyển onClick của bạn trong onBindViewHolder và thiết lập kích như dưới đây, Hy vọng nó sẽ giải quyết vấn đề của bạn ....

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

Sự cố có liên quan đến android: focusable = "true" trong bố cục của tôi, vì tôi đã xóa sự cố này, hoạt động tốt, tất cả các câu trả lời được đề xuất cũng hoạt động tốt.

0

Thêm những yếu tố phụ huynh để lại R.layout.item_app_list

android:clickable="false" 
android:focusable="false" 
Các vấn đề liên quan