【问题标题】:How to set itemclick listener in a BaseRecyclerAdapter如何在 BaseRecyclerAdapter 中设置 itemclick 监听器
【发布时间】:2021-09-08 10:23:44
【问题描述】:

我有一个像这样的基本回收器适配器:

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

OnItemClickListener:

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

基础视图持有者是:

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

假设 ViewHolder 有 2 个视图,一个 TextView 和一个 ImageView。如何为 ViewHolder 的 itemview 内的所有项目实现 ClickListener

【问题讨论】:

    标签: android android-recyclerview baseadapter android-viewholder onitemclicklistener


    【解决方案1】:

    我认为我们不能从基础适配器为 itemView 中的特定项目设置 clickListener。但是我们可以将布局的侦听器设置为变量。

    为此在布局的数据标签中定义 clickListener 变量。

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

    然后从基础适配器设置 clickListener 布局

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

    然后您可以在单击特定项目时调用侦听器方法。

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

    【讨论】:

    • 我认为不可能在回收站视图中设置这样的监听器。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多