java - RecyclerView Item Click Listener 的正确方式

标签 java android android-recyclerview android-gridview

我使用 RecyclerView 适配器在 Activity 中显示数据,我想在 Activity 中实现 onClickListener,目前,我正在设置 onClickListener内部适配器像往常一样工作正常。

public void onBindViewHolder(MyHolder holder, final int position) {
    final Listdata data = listdata.get(position);
    holder.vname.setText(data.getName());

    holder.vname.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(activity, "clicked on " +position, Toast.LENGTH_SHORT).show();
        }
    });
}

但是我想在 Activity 中实现它,以便我有更大的控制权。这不符合我的目的。我认为这对我们很多人都有用。

最佳答案

你需要检查this tutorial在这里可以更好地了解如何实现所需的行为。

如果要从您的 Activity 中处理 onClickListener,您需要基于带有接口(interface)的回调实现来工作。将接口(interface)从 Activity 传递到您的适配器,然后在单击某些项目时从您的适配器调用回调函数。

这是教程中的示例实现。

让我们先来看看界面。

public interface OnItemClickListener {
    void onItemClick(ContentItem item);
}

您需要修改您的适配器以将监听器作为参数,如下所述。

private final List<ContentItem> items;
private final OnItemClickListener listener;

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
    this.items = items;
    this.listener = listener;
}

现在在您的 onBindViewHolder 方法中,设置点击监听器。

@Override public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(items.get(position), listener);
}

public void bind(final ContentItem item, final OnItemClickListener listener) {
    ...
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            listener.onItemClick(item);
        }
    });
}

现在在您的 RecyclerView 中设置适配器。

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
    @Override public void onItemClick(ContentItem item) {
        Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
    }
}));

所以整个适配器代码如下所示。

public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> {

    public interface OnItemClickListener {
        void onItemClick(ContentItem item);
    }

    private final List<ContentItem> items;
    private final OnItemClickListener listener;

    public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
        this.items = items;
        this.listener = listener;
    }

    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
        return new ViewHolder(v);
    }

    @Override public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(items.get(position), listener);
    }

    @Override public int getItemCount() {
        return items.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView name;
        private ImageView image;

        public ViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            image = (ImageView) itemView.findViewById(R.id.image);
        }

        public void bind(final ContentItem item, final OnItemClickListener listener) {
            name.setText(item.name);
            Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    listener.onItemClick(item);
                }
            });
        }
    }
}

关于java - RecyclerView Item Click Listener 的正确方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969278/

相关文章:

java - 无法编译 Artifactory 7.10.2

java - 如何使用 Spring MVC 从 url 下载文件?

安卓 : MPAndroidChart how to remove left side line

android - 如何将注销放在操作栏菜单中

android - Realm 查询不更新我的适配器

java - 尝试通过改造解析 JSON Feed 时出现 IllegalStateException

java - java 中的 volatile,具有 long、int、boolean 和许多不同的 write 情况

android - 任务 ':app:checkDebugDuplicateClasses' 执行失败。 Ionic4 安卓

java - 阅读Firebase DB后如何更改RecyclerView中的itemView?

Java - C-Like Fork?