向通用 RecyclerView 适配器添加点击侦听器

2024-01-05

Edit

因为它是一个通用适配器,并不简单,而且我知道添加点击侦听器的方法。在以下情况下这样做并不是一个好的做法onCreateViewHolder。所以这就是为什么我需要更好的建议

我创建了一个RecyclerView 的通用适配器 in android。现在我想要一些改进它的建议。我怎样才能添加 clickListener 到它。

通用适配器.java

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private ArrayList<T> items;
    private OnRecyclerItemClicked onRecyclerItemClicked;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public GenericAdapter(Context context, ArrayList<T> items){
        this.context = context;
        this.items = items;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent);
        return holder;
    }

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

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

    public void addItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

    public T getItem(int position){
        return items.get(position);
    }

    public void setOnRecyclerItemClicked(OnRecyclerItemClicked onRecyclerItemClicked){
        this.onRecyclerItemClicked = onRecyclerItemClicked;
    }

    public interface OnRecyclerItemClicked{
        void onItemClicked(View view,int position);
    }
}

并称其为

adapter = new GenericAdapter<MyModelClass>(context,listOfModelClass) {
                @Override
                public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) {
                    final View view = LayoutInflater.from(context).inflate(R.layout.item_recycler_view, parent, false);
                    AViewHolder viewHolder = new AViewHolder(context, view);
                    return viewHolder;
                }

                @Override
                public void onBindData(RecyclerView.ViewHolder holder1, MyModelClass val) {
                        MyModelClass currentCard = val;

                        AViewHolder holder = (AViewHolder)holder1;
                        holder.cardNumber.setText(currentCard.getDisplayNumber());
                        holder.cardHolderName.setText(currentCard.getCardHolderName());
                }
            };
            mRecyclerView.setAdapter(adapter);

现在我可以如何以及在哪里添加点击侦听器。由于向 onBindData 添加点击侦听器是一项开销。需要建议。


您是否尝试过添加 ViewHolder 并向其中添加 clicklistener

现在是 GenericAdapter.java。

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<T> items;
    private OnRecyclerItemClicked onRecyclerItemClicked;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent , OnRecyclerItemClicked onRecyclerItemClicked);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public abstract OnRecyclerItemClicked onGetRecyclerItemClickListener();

    public GenericAdapter(Context context, List<T> items){
        this.context = context;
        this.items = items;
        onRecyclerItemClicked = onGetRecyclerItemClickListener();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent , onRecyclerItemClicked);
        return holder;
    }

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

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

    public void setItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

    public T getItem(int position){
        return items.get(position);
    }

    public interface OnRecyclerItemClicked{
        void onItemClicked(View view,int position);
    }
}

并这样称呼它

GenericAdapter<CreditCardItemBO> adaptering = new GenericAdapter<CreditCardItemBO>(mContext,new ArrayList<CreditCardItemBO>()) {
            @Override
            public RecyclerView.ViewHolder setViewHolder(ViewGroup parent, OnRecyclerItemClicked onRecyclerItemClicked) {
                final View view = LayoutInflater.from(mContext).inflate(R.layout.item_save_credit_card, parent, false);
                CreditCardViewHolder viewHolder = new CreditCardViewHolder(mContext, view,onRecyclerItemClicked);
                return viewHolder;
            }

            @Override
            public void onBindData(RecyclerView.ViewHolder holder, CreditCardItemBO val) {

            }

            @Override
            public OnRecyclerItemClicked onGetRecyclerItemClickListener() {
                return new OnRecyclerItemClicked() {
                    @Override
                    public void onItemClicked(View view, int position) {

                    }
                };
            }
        };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向通用 RecyclerView 适配器添加点击侦听器 的相关文章

随机推荐

  • 早期返回与嵌套正 if 语句

    这是一些假设的代码示例 if e KeyCode Keys Enter if this CurrentElement null return false if this CurrentElement this MasterElement r
  • 视频标签中的 YouTube URL

    我正在使用
  • 用于 WorkItemAttribute?

    我注意到 Visual Studio 测试中有一个属性 Microsoft VisualStudio TestTools UnitTesting WorkItemAttribute 可用 我正在使用 VS 2010 Premium 和 TF
  • 为什么在Java算术中,上溢或下溢永远不会抛出异常?

    在Java算术运算期间 JVM不会抛出下溢或溢出异常 很多时候我们会遇到意想不到的结果 并想知道哪里出了问题 而在 NET 技术的情况下 我们有溢出和下溢异常 所以我的问题是 为什么Java被设计成在算术运算期间不抛出这个异常 这可能是多种
  • 如何将 before_filter 应用于 Rails 3.2.11 中每个控制器的每个操作?

    我想验证用户是否在对服务器的每个请求中登录 就像是 before filter verify logged in 我应该将 before filter 放在哪里 以便它适用于所有控制器操作和所有请求 要确保过滤器适用于所有操作 请将其放置在
  • Android JQuery focus() 解决方法

    我正在开发一个 HTML5 移动应用程序 使用常规 jQuery 而不是移动应用程序 它实现了出现在文本区域下方的自定义自动完成列表 用户从列表中选择一个选项 该单词将自动完成 然后用户照常继续输入 问题在于 用户点击文本框外部以从自动完成
  • 自动装配应用程序上下文

    我正在尝试自动装配WebApplicationContext进入一个班级ImageCreatorUtil这是我在 Spring MVC 项目中创建的 在类中执行使用应用程序上下文的方法时 我总是收到 NPE 需要注意的是 该方法是由Appl
  • 在模型中使用 cakephp 组件

    如何在我的模型类之一中使用我在 cakePHP 中创建的组件 这可能吗 如果是这样 请告诉我该怎么做 这是可能的 但很漂亮不好的做法 in a MVC http en wikipedia org wiki Model E2 80 93vie
  • HTML 输出的单元测试?

    这可能是一个愚蠢的问题 但是您是否对 PHP 函数 脚本的 HTML 输出进行单元测试 我尝试将我的 HTML 和 PHP 分开 即 HTML 包含占位符 以及某些重复元素的函数 表格数据 任何类型的循环输出 但我不知道如何去验证这一点 是
  • Firebase iOS 推送通知在首次安装时不起作用

    当我第一次安装并打开应用程序并接受来自 Apple 的通知权限警报时 我从 Firebase 收到以下日志 5 16 0 Firebase InstanceID I IID023004 无法将密钥对的属性更新为首次解锁后可访问 更新 状态
  • 生产/构建中的 Material-UI 渲染错误

    我在构建我的反应应用程序时遇到了很大的问题 我正在使用material ui core v 4 10 2 在正常的反应脚本启动开发服务器上一切正常 但是 当通过 Nginx 或 npm module 构建并提供服务时 渲染无法正常工作 我在
  • 重置等待计时器

    来自 MSDN The 取消等待定时器 http msdn microsoft com en us library ms681985 aspx函数不会改变定时器的信号状态 它会在定时器设置为有信号状态之前停止定时器并取消未完成的 APC 因
  • 类型错误:int() 参数必须是字符串、类似字节的对象或数字,而不是“datetime.datetime”

    我试图为我的所有模型添加 created at 字段 但收到以下错误 TypeError int argument must be a string a bytes like object or a number not datetime
  • twitter bootstrap 3.0 typeahead ajax 示例

    Bootstrap 2 有很多 typeahead ajax 示例 例如这里twitter bootstrap typeahead ajax 示例 https stackoverflow com questions 9232748 twit
  • 从数据框创建稀疏矩阵

    我正在做一项作业 尝试为 Netflix 奖项数据构建协作过滤模型 我使用的数据位于 CSV 文件中 我可以轻松地将其导入到数据框中 现在我需要做的是创建一个稀疏矩阵 其中用户作为行 电影作为列 每个单元格都由相应的评级值填充 当我尝试绘制
  • 另一个本地 gem 的“gem.add_dependency”

    我正在创建一个 gem 它依赖于另一个已发布的 gem 在my gem gemspec 我已将依赖项添加到另一个 gem gem add dependency other gem gt 1 0 0 现在 我发现了一个可以调整的功能其他宝石
  • 如何仅在增量代码上运行 Maven checkstyle 插件

    我想向我们的应用程序添加自动代码审查功能 目前我们使用maven来进行构建 我遇到了 Maven checkstyle 插件 但希望它仅在添加的增量代码上运行 而不是在旧代码上运行 我可以使用这个插件实现这个目标吗 如果是 请提供有关如何操
  • Shiny DataTable:使用按钮扩展保存完整的 data.frame

    我正在将 DataTables 与 Shiny 一起使用 通过按钮扩展 用户可以下载或打印数据表中的数据 但仅下载 打印行的可见部分 我想改变这种行为 以便可以下载包含所有行的完整 data frame 这可以通过按钮扩展实现吗 还是我必须
  • jQuery AJAX 回调中抛出的异常被吞没?

    除了向每个回调添加 try catch 块之外 还有什么方法可以处理 jQuery 中 AJAX 回调引发的异常吗 在这种情况下不会调用错误函数 ajax url myurl rails success function data thro
  • 向通用 RecyclerView 适配器添加点击侦听器

    Edit 因为它是一个通用适配器 并不简单 而且我知道添加点击侦听器的方法 在以下情况下这样做并不是一个好的做法onCreateViewHolder 所以这就是为什么我需要更好的建议 我创建了一个RecyclerView 的通用适配器 in