【问题标题】:Android RecyclreView OnCLick ListenerAndroid RecyclerView OnCLick 监听器
【发布时间】:2018-07-30 11:07:17
【问题描述】:

android recyclerView 适配器出错。单击 RecyclerView 项目时,应用程序将停止工作。我想在单击任何项​​目时进行其他活动,当我使用 Toast 时它工作正常,但如果我添加 Intent 则它停止工作。

这是我的界面:

public interface OnItemClickListener {
        void onClick(View view, int position);
}

这是我的回收器适配器类:

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

    private List<Items> items;
    private Context context;

    public RecAdapter(List<Items> items, Context context )
    {
        this.items = items;
        this.context = context;
    }

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

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position)  {

        holder.countryname.setText(items.get(position).getCountryname());
        holder.rank.setText(items.get(position).getRank());
        Picasso.with(context)
                .load(items.get(position).getFlag())
                .into(holder.flag);
        holder.setClickListener(new OnItemClickListener() {
            @Override
            public void onClick(View view, int position) {
                Intent intent = new Intent(context , Main2Activity.class);
                context.startActivity(intent);
            }
        });
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView countryname, rank;
        ImageView flag;
        private OnItemClickListener clickListener;

        public MyViewHolder(View itemView) {
            super(itemView);
            countryname = (TextView) itemView.findViewById(R.id.capital);
            rank = (TextView) itemView.findViewById(R.id.rank);
            flag = (ImageView) itemView.findViewById(R.id.flag);
            itemView.setTag(itemView);
            itemView.setOnClickListener(this);

        }
        public void setClickListener(OnItemClickListener itemClickListener) {
            this.clickListener = itemClickListener;
        }
            @Override
        public void onClick(View view) {
            if (clickListener != null) clickListener.onClick(view, getAdapterPosition());
        }    
    }
}

【问题讨论】:

  • Error on android recyclerView Adpter class 什么错误?
  • 这是因为 contextNULL ...另外,onBindViewHolder 有一个完全不同的责任,而不是你想要在那里完成的事情。
  • 格式化代码。

标签: android android-recyclerview onclicklistener


【解决方案1】:

像这样添加点击监听器:-

View itemView;
Context context;


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);
    this.context=parent.getContext();
    return new ViewHolder(itemView);
}
@Override
    public void onBindViewHolder(final ViewHolder holder, int position) {

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context , Main2Activity.class);
                context.startActivity(intent);
            }
        });
    }

【讨论】:

    【解决方案2】:

    从另一个问题复制我的答案:

    您已经知道,RecyclerView 类中不再提供此方法。

    我在RecyclerView 中实现onClick 事件的方法是这样的:

    class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    
        interface OnClickListener {
            void onClick(Item item);
        }
    
        private final List<Item> dataset;
        private final OnClickListener l; 
    
        public MyAdapter(List<Item> data, OnClickListener listener) {
            this.dataset = data;
            this.l = listener;
        }
    
        @Override MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = //inflate layout
            MyClick click = new MyClick() {
                onClick(int position) {
                    if (l != null) {
                        l.onClick(dataset.get(position));
                    }
                }
            };
            return new MyViewHolder(click, v);
        }
    
        static class MyViewHolder {
            final MyClick l;
    
            public MyViewHolder(MyClick listener, View view) {
                super(view);
                l = listener;
                // inflate views
                view.setOnClickListener(new OnClickListener() {
                    if (l != null) {
                        l.onClick(getAdapterPosition());
                    }
                });
            }
    
            interface MyClick {
                void onClick(int position);
            }
        }
    }
    
    class MyActivity extends AppCompatActivity {
    
        @Override void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // set layout
            MyAdapter adapter = new MyAdapter(getData(), new OnClickListener() {
                @Override onClick(Item item) {
                    // do stuff with item
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      你不能直接点击一个持有者.....给视图一个id然后重写代码如下:

      holder.(someitem).setClickListener(new OnItemClickListener() {//you need a view to execute the onclicklistener
                  @Override
                  public void onClick(View view, int position) {
                      Intent intent = new Intent(context , Main2Activity.class);
                      context.startActivity(intent);
                  }
              });
      

      【讨论】:

        【解决方案4】:

        这是我为 Recycler Item Click

        创建点击监听器的代码

        使用这个你会得到两种类型的点击

        1. 简单的项目点击。
        2. 项目长按。

        这里是 RecyclerItemClickListener.java 文件

        public class RecyclerItemClickListener  implements RecyclerView.OnItemTouchListener {
        public interface OnItemClickListener
        {
            void onItemClick(View view, int position);
            void onItemLongClick(View view, int position);
        }
        
        private OnItemClickListener mListener;
        private GestureDetector mGestureDetector;
        
        public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener)
        {
            mListener = listener;
        
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()
            {
                @Override
                public boolean onSingleTapUp(MotionEvent e)
                {
                    return true;
                }
        
                @Override
                public void onLongPress(MotionEvent e)
                {
                    View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
        
                    if(childView != null && mListener != null)
                    {
                        mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView));
                    }
                }
            });
        }
        
        @Override
        public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e)
        {
            View childView = view.findChildViewUnder(e.getX(), e.getY());
        
            if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e))
            {
                mListener.onItemClick(childView, view.getChildPosition(childView));
            }
        
            return false;
        }
        
        @Override
        public void onTouchEvent(RecyclerView view, MotionEvent motionEvent){}
        
        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        
        }
        

        }

        如何在Activity和Fragment中使用

          rvcyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, rvcyclerView,
                        new RecyclerItemClickListener.OnItemClickListener() {
                            @Override
                            public void onItemClick(View view, int position) {
                                //do you what you want tot do simple click
                            }
        
                            @Override
                            public void onItemLongClick(View view, int position) {
                                //do you what you want tot do on long click
                            }
                        }));
        

        【讨论】:

          【解决方案5】:
          public class RecAdapter extends RecyclerView.Adapter<RecAdapter.MyViewHolder> implements View.OnClickListener {
          
              private List<Items> items;
              private Context context;
              private OnItemClickListener clickListener;
          
              public RecAdapter(List<Items> items, Context context )
              {
                  this.items = items;
                  this.context = context;
              }
          
              public void setClickListener(OnItemClickListener itemClickListener) {
                  this.clickListener = itemClickListener;
              }
          
              @Override
              public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                  View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item,parent,false);
          
                  return new MyViewHolder(view);
              }
          
              @Override
              public void onBindViewHolder(MyViewHolder holder, int position)  {
          
                  holder.countryname.setText(items.get(position).getCountryname());
                  holder.rank.setText(items.get(position).getRank());
                  Picasso.with(context)
                          .load(items.get(position).getFlag())
                          .into(holder.flag);
                  holder.flag.setOnClickListener(this);
              }
          
              @Override
              public int getItemCount() {
                  return items.size();
              }
          
              public class MyViewHolder extends RecyclerView.ViewHolder {
          
                  TextView countryname, rank;
                  ImageView flag;
          
                  public MyViewHolder(View itemView) {
                      super(itemView);
                      countryname = (TextView) itemView.findViewById(R.id.capital);
                      rank = (TextView) itemView.findViewById(R.id.rank);
                      flag = (ImageView) itemView.findViewById(R.id.flag);
          
                  }
          
                      @Override
                  public void onClick(View view) {
                      if (clickListener != null) clickListener.onClick(view, getAdapterPosition());
                  }    
              }
          }
          

          在您的 Activity/Fragment 上实现 OnItemClickListener

              public class MainActivity extends AppCompatActivity implements OnItemClickListener{
              @Override
                  public void onCreate(@Nullable Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      LinearLayoutManager layout = new 
                      LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL, false);
                      mRecyclerView.setLayoutManager(layout );
                      mRecyclerView.setItemAnimator(new DefaultItemAnimator());
                      RecAdapter adapter = new RecAdapter(items ,getContext());
                      adapter.setClickListener(this);
                      mRecyclerView.setAdapter(adapter );
                  }
          
               @Override
                  public void onClick(View view, int position) {
                 switch(view.getId()) {
                 }
           }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-31
            • 1970-01-01
            • 2015-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多