Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView适配器自定义侦听器接口_Java_Android_Android Activity_Android Recyclerview - Fatal编程技术网

Java RecyclerView适配器自定义侦听器接口

Java RecyclerView适配器自定义侦听器接口,java,android,android-activity,android-recyclerview,Java,Android,Android Activity,Android Recyclerview,我有一个带有自定义侦听器的RecyclerView,我想在我的主活动中实现它,以便在单击RecyclerView项时得到通知 但是,我不确定将setMyAdapterListener放在适配器中的什么位置。我该把它放在哪里 public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<Dat

我有一个带有自定义侦听器的RecyclerView,我想在我的主活动中实现它,以便在单击RecyclerView项时得到通知

但是,我不确定将
setMyAdapterListener
放在适配器中的什么位置。我该把它放在哪里

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;

    private List<Data> data;

    private MyAdapterListener myAdapterListener;

    public MyAdapter(Context context, List<Object> data) {
        this.context = context;
        this.data = data;
    }

    public interface MyAdapterListener {
        void onContainerClick();
    }

    public void setMyAdapterListener(MyAdapterListener myAdapterListener) {
        this.myAdapterListener = myAdapterListener;
    }

    public class ViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener {
        public LinearLayout container;

        public ImageView poster;

        public ViewHolderItem(View v) {
            super(v);

            container = (LinearLayout) v.findViewById(R.id.container);

            poster = (ImageView) v.findViewById(R.id.poster);
        }

        @Override
        public void onClick(View v) {
            int id = v.getId();

            if (id == R.id.container) {
                if (myAdapterListener != null) {
                    myAdapterListener.onContainerClick();
                }
            }
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        View v2 = inflater.inflate(R.layout.item_layout, parent, false);
        viewHolder = new ViewHolderItem(v2);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Data item = (Data) data.get(position);

        holder.poster.setImageDrawable(someDrawable);
    }

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

}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私人语境; 私人名单数据; 私人MyAdapterListener MyAdapterListener; 公共MyAdapter(上下文、列表数据){ this.context=上下文; 这个数据=数据; } 公共接口MyAdapterListener{ void oncontainer单击(); } public void setMyAdapterListener(MyAdapterListener MyAdapterListener){ this.myAdapterListener=myAdapterListener; } 公共类ViewHolderItem扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 公共线路布局集装箱; 公众影像浏览海报; 公共ViewHolderItem(视图v){ 超级(五); 容器=(线性布局)v.findViewById(R.id.container); 海报=(图像视图)v.findviewbyd(R.id.poster); } @凌驾 公共void onClick(视图v){ int id=v.getId(); if(id==R.id.container){ 如果(myAdapterListener!=null){ myAdapterListener.onContainerClick(); } } } } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ RecyclerView.ViewHolder ViewHolder=null; LayoutInflater充气器=LayoutInflater.from(parent.getContext()); 视图v2=充气机。充气(R.layout.item_布局,父项,false); viewHolder=新的ViewHolderItem(v2); 返回视图持有者; } @凌驾 BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){ 数据项=(数据)Data.get(位置); 支架。海报。可设置图像绘制(可绘制); } @凌驾 public int getItemCount(){ 返回data.size(); } } 删除setMyAdapter(),只需将setMyAdapterListener中当前包含的参数作为recyclerview的适配器构造函数的一部分进行传递,如下所示:

public MyAdapter(Context context, List<Object> data, MyAdapterListener myAdapterListener) {
        this.context = context;
        this.data = data;
        this.myAdapterListener = myAdapterListener;
    }
公共MyAdapter(上下文上下文、列表数据、MyAdapterListener MyAdapterListener){ this.context=上下文; 这个数据=数据; this.myAdapterListener=myAdapterListener; }
//在活动中,您必须实现接口的方法。

正如@ScottS所说,您不需要setMyAdapter()方法,只需将onclick listener接口类作为参数传递给适配器构造函数,然后在活动类中实现接口方法。。代码如下所示

公共MyAdapter(上下文、列表数据){ this.context=上下文; 这个数据=数据; this.myAdapterListener=myAdapterListener; } 公共接口MyAdapterListener{ void onContainerClick();//请提供2个参数,以帮助您进行如下所示的操作 ///void oncontainer单击(视图,int位置); } } 公共类ViewHolderItem扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 公共线路布局集装箱; 公众影像浏览海报; 公共ViewHolderItem(视图v){ 超级(五); 容器=(线性布局)v.findViewById(R.id.container); 海报=(图像视图)v.findviewbyd(R.id.poster); container=setOnClickListener(this);///此行必须包括 } @凌驾 公共void onClick(视图v){ int id=v.getId(); if(id==R.id.container){ 如果(myAdapterListener!=null){ myAdapterListener.onContainerClick(); //onContainerClick(v,getAdapterPosition()); } } }
}您的问题解决了吗?