当前位置: 首页 > 知识库问答 >
问题:

如何在BaseRecyclerAdapter中设置itemick监听器

公西俊民
2023-03-14

我有一个基本回收适配器,如下所示:

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

监听器

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有两个视图,一个TextView和一个ImageView。如何对ViewHolder的itemview中的所有项目实现ClickListener

共有1个答案

诸正谊
2023-03-14

我认为我们不能从基本适配器为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()}"
     />
 类似资料:
  • 我正在制作Instagram克隆应用程序。我想添加双击功能。如何在ImageView上设置双击侦听器?

  • 在我的应用程序中,我想在我的首选项activity中的单个preferencelist项上设置一个click listener,问题是我只能找到如何在主listprefernce本身上设置一个click listener,有没有一种方法我可以设置一个键到单个列表项,这样当我设置一个OnPreferenceClickListener时,我可以执行一些列表项特定的代码?

  • 这只是一个例子。我有一个输入流,我想为它设置一个侦听器。我怎么能做到。第一种方法是创建一个后台线程,反复检查它。 但我认为没有线。睡眠会浪费cpu周期。和它一起;它会降低获取事件的准确性。假设输入流是一个无法访问的输出流正在写入的文件。这只是一个例子,说明我不知道这种后台线程的运行时成本。请解释一下。

  • 我正在处理一些奇怪的遗留代码。他们有一个实现JPanel的自定义对象。这个< code>JPanel对象是主应用程序中的第二个弹出屏幕。我遇到的问题是检测辅助弹出屏幕何时关闭。 我尝试为该类实现一个,但是当我尝试添加它时,没有与此对象关联的。我假设这是因为他们正在使用一个自定义对象,它是一个嵌入式弹出屏幕。 我尝试使用以下命令检索: 这在上失败。我不知道为什么在这个页面上检测右上角的“x”关闭按钮

  • 我知道java.nio.file包提供了一个文件更改通知API(观察服务API)。

  • 我试图用我的键控制火箭动画,并尝试使用KeyListener方法,然而,我的程序对我的按键没有反应。我尝试将keylistener添加到我的JFrame,但它没有调用它,因为JFrame是一个单独的静态方法。如果你运行它,你将没有图像,但是,如果你运行,请替换为矩形。你能说出我的错误吗。提前谢了。 下面是我的代码: