androidandroid-recyclerviewbaseadapterandroid-viewholderonitemclicklistener

How to set itemclick listener in a BaseRecyclerAdapter


I have a base recycler adapter like this:

public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseViewHolder> {

    public @NotNull BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

        ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false);

        return new BaseViewHolder(binding);
    }

    public void onBindViewHolder(BaseViewHolder holder, int position) {

        Object obj = getObjForPosition(position);

        OnItemClickListener clickListener = onItemClickListener();

        holder.bind(obj, clickListener, position);

    }

    @Override
    public int getItemViewType(int position) {
        return getLayoutIdForPosition(position);
    }

    protected abstract Object getObjForPosition(int position);

    protected abstract int getLayoutIdForPosition(int position);

    protected abstract OnItemClickListener onItemClickListener();
}

The OnItemClickListener:

public interface OnItemClickListener {
    void onItemClick(Object object, View view, int position);
}

And the base view holder is:

public class BaseViewHolder extends RecyclerView.ViewHolder {

    private final ViewDataBinding binding;

    public BaseViewHolder(ViewDataBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public void bind(Object obj, OnItemClickListener clickListener, int position) {

        itemView.setOnClickListener(v -> clickListener.onItemClick(obj, itemView, position));

        binding.setVariable(BR.obj, obj);
        binding.executePendingBindings();
    }
}

Let's say the ViewHolder has 2 views, a TextView and an ImageView. how can I implement a ClickListener to all the items that are inside the itemview of the ViewHolder


Solution

  • I think we can not set the clickListener for specific item within itemView from base adapter.but instead we can set listener for layout as variable.

    For that define clickListener variable within data tag in your layout.

       <data>
        <variable
            name="clickListener"
            type="com.package.clickListener" />
        </data>
    

    Then set clickListener for layout from base adapter

    public void bind(Object obj, OnItemClickListener clickListener, int position) {
    
            itemView.setOnClickListener(v -> clickListener.onItemClick(obj, itemView, position));
            binding.setVariable(BR.clickListener,clickListener)//set listener here
            binding.setVariable(BR.obj, obj);
            binding.executePendingBindings();
        }
    

    Then you can call listener method when specific item clicked.

         <Button
            android:id="@+id/btn"
        android:onClick="@{()-> callListener.onItemClick()}"
         />