RecyclerView adapter custom listener interface

旧时模样 提交于 2019-12-24 02:14:54

问题


I have a RecyclerView with a custom listener that I want to implement in my main activity so that it gets notified when the RecyclerView item gets clicked.

However, I'm not sure where to put setMyAdapterListener in the adapter. Where would I put it?

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

}

回答1:


Remove the setMyAdapter() just pass the arguments you currently have in your setMyAdapterListener as part of your recyclerview's adapter contructor, see below:

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

//On your activity you have to implement the methods of your interface.




回答2:


As @ScottS Said you dont need setMyAdapter() method, just pass the onclick listener Interface class as a argument to your adapter constructor then implement the interface methods in activity Class .. code is shown below.

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

Then you can handle the events in your Activity or wherever your RecyclerView is being used:

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


来源:https://stackoverflow.com/questions/43300442/recyclerview-adapter-custom-listener-interface

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!