Android RecycleReview OnCLick侦听器

Android RecycleReview OnCLick侦听器,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,android recyclerView适配器出错。当点击RecyclerView项目时,应用程序将停止工作。我想在单击任何项目时转到其他活动,当我使用Toast时,它工作正常,但如果我添加了意图,则它停止工作 这是我的界面: public interface OnItemClickListener { void onClick(View view, int position); } 这是我的回收器适配器校准: public class RecAdapter extends R

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

这是我的界面:

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());
        }    
    }
}
公共类RecAdapter扩展了RecyclerView.Adapter{
私人清单项目;
私人语境;
公共重新适配器(列表项、上下文)
{
这个项目=项目;
this.context=上下文;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u项,parent,false);
返回新的MyViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
holder.countryname.setText(items.get(position.getCountryname());
holder.rank.setText(items.get(position.getRank());
毕加索。与(上下文)
.load(items.get(position.getFlag())
.进入(持有人旗帜);
holder.setClickListener(新的OnItemClickListener(){
@凌驾
公共void onClick(视图,int位置){
意向意向=新意向(上下文,Main2Activity.class);
背景。开始触觉(意图);
}
});
}
@凌驾
public int getItemCount(){
返回items.size();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
TextView国家名称、等级;
图像视图标志;
私有侦听器clickListener;
公共MyViewHolder(查看项目视图){
超级(项目视图);
countryname=(TextView)itemView.findViewById(R.id.capital);
rank=(TextView)itemView.findViewById(R.id.rank);
flag=(ImageView)itemView.findViewById(R.id.flag);
setTag(itemView);
setOnClickListener(这个);
}
public void setClickListener(OnItemClickListener项ClickListener){
this.clickListener=itemClickListener;
}
@凌驾
公共void onClick(视图){
如果(clickListener!=null)clickListener.onClick(view,getAdapterPosition());
}    
}
}

您不能直接单击支架。。。。。为视图提供一个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);
            }
        });

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

如您所知,此方法在
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
            }
        });
    }
}
类MyAdapter扩展了RecyclerView.Adapter{ 接口OnClickListener{ 单击(项目)后作废; } 私人最终清单数据集; 私人最终单选; 公共MyAdapter(列表数据,OnClickListener侦听器){ this.dataset=数据; this.l=侦听器; } @重写MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=//充气布局 MyClick=新建MyClick(){ onClick(int位置){ 如果(l!=null){ l、 onClick(dataset.get(position)); } } }; 返回新的MyViewHolder(单击,v); } 静态类MyViewHolder{ 最终MYL; 公共MyViewHolder(MyClick侦听器,视图){ 超级(视图); l=听者; //夸大观点 view.setOnClickListener(新的OnClickListener(){ 如果(l!=null){ l、 onClick(getAdapterPosition()); } }); } 界面MyClick{ void onClick(内部位置); } } } 类MyActivity扩展了AppCompatActivity{ @在创建时覆盖void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //集合布局 MyAdapter=新的MyAdapter(getData(),new OnClickListener()){ @覆盖onClick(项){ //处理物品 } }); } }
添加单击侦听器,如下所示:-

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

下面是我为回收项目单击创建的单击侦听器的代码

使用此选项,您将获得两种类型的单击

  • 简单的项目点击
  • 项目长按 这是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) {
    
    }
    
    }

    如何在活动和片段中使用

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

    }

    android recyclerView Adpter类上的错误
    什么错误?这是因为
    上下文
    空的
    …而且,
    onBindViewHolder
    还有一个完全不同的责任,而不是你在那里试图完成的。格式化代码。
    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());
            }    
        }
    }
    
        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()) {
           }
     }