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

时间:2017-04-08 21:16:04

标签: java android android-activity android-recyclerview

我有一个带有自定义侦听器的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();
    }

}

2 个答案:

答案 0 :(得分:1)

删除setMyAdapter()只是将你当前在setMyAdapterListener中拥有的参数作为recyclerview的适配器构造函数的一部分传递,见下文:

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

//在您的活动中,您必须实现界面的方法。

答案 1 :(得分:0)

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

 public MyAdapter(Context context, List<Object> data) {
         this.context = context;
         this.data = data;
          this.myAdapterListener = myAdapterListener;
    }
    
    public interface MyAdapterListener {
    void onContainerClick(); // please provide 2 parameter that will help you more for manipulation like shown below
/// void onContainerClick(View view, int position); 
}

 }

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

        container =setOnClickListener(this); /// this line must include
    }

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

        if (id == R.id.container) {
            if (myAdapterListener != null) {
                myAdapterListener.onContainerClick();
               // myAdapterListener.onContainerClick(v,getAdapterPosition());
            }
        }
    }
}

然后,您可以处理Activity中的事件或使用RecyclerView的任何位置:

mAdapter = new MyAdapter(getApplicationContext() , data, new MyAdapter.MyAdapterListener() {
                    @Override
                    public void onContainerClick(View v, int position) {
                        Log.d(TAG, "iconTextViewOnClick at position "+position);
                    }

                });
mRecycler.setAdapter(mAdapter);

相关问题