多个适配器或一个适配器用于不同的列表和对象 - 代码性能

2024-01-10

就性能而言,在 Android 应用程序中实现更好的选择是什么:

  • 每个具有不同对象列表的多个适配器 布局,
  • 处理不同数据的单个适配器。

假设我们需要创建

  • 评论,
  • Videos,

  • 问题

    适配器中的列表以正确显示数据。每个列表属于不同的布局,因此我们有不同的TextViews, ImageViews等等。

    公共类 FilesAdapter 扩展 RecyclerView.Adapter {

    公共静态最终 int VIDEO_FILES_ADAPTER = 1; 公共静态最终 int COMMENT_ADAPTER = 2; 公共静态最终 int QUESTIONS_ADAPTER = 3;

    私有 int CURRENT_ADAPTER;

    私有列表视频文件; 私人列表评论; 私人列表问题;

    布尔值 isForUser;

    公共FilesAdapter(int currentAdapter,列表videoFiles,布尔isForUser){ this.videoFiles = videoFiles; this.CURRENT_ADAPTER = currentAdapter; this.isForUser = isForUser; }

    公共 FilesAdapter(int currentAdapter, 列表注释){ this.comments = 评论; this.CURRENT_ADAPTER = currentAdapter; }

    公共 FilesAdapter(int currentAdapter, 列出问题, intusedVariable){ this.questions = 问题; this.CURRENT_ADAPTER = currentAdapter; }

    @非空 @覆盖 公共 FilesViewHolder onCreateViewHolder(@NonNull ViewGroup 父级,int viewType){ 查看视图; 文件视图保持器视图保持器;

    switch(CURRENT_ADAPTER){
    
        case VIDEO_FILES_ADAPTER:
    
            if(isForUser){
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_file_user, parent, false);
            }else{
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_file_main, parent, false);
            }
    
            viewHolder = new FilesViewHolder(VIDEO_FILES_ADAPTER, view, isForUser);
    
            return viewHolder;
    
        case COMMENT_ADAPTER:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_comment, parent, false);
            viewHolder = new FilesViewHolder(COMMENT_ADAPTER, view, false);
    
            return viewHolder;
    
        case QUESTIONS_ADAPTER:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_question, parent, false);
            viewHolder = new FilesViewHolder(QUESTIONS_ADAPTER, view, false);
    
            return viewHolder;
    }
    
    return null;
    

    }

    @覆盖 公共无效onBindViewHolder(@NonNull FilesViewHolder持有者,int位置){

    switch (CURRENT_ADAPTER){
    
        case VIDEO_FILES_ADAPTER:
            holder.videoTitle.setText(videoFiles.get(position).getFileName());
            holder.videoDescription.setText(videoFiles.get(position).getFileDescription());
            if(isForUser){
                holder.videoDate.setText(videoFiles.get(position).getFileCreatedAt());
            }else{
                holder.videoUser.setText(videoFiles.get(position).getUsername());
            }
    
            holder.videoCount.setText(videoFiles.get(position).getWatched());
            break;
    
        case COMMENT_ADAPTER:
            holder.commentComment.setText(comments.get(position).getComment());
            holder.commentUsername.setText(comments.get(position).getUsername());
            holder.commentCreatedAt.setText(comments.get(position).getCreatedAt());
            break;
    
        case QUESTIONS_ADAPTER:
            holder.questionTitle.setText(questions.get(position).getProviderUsername());
            break;
    }
    

    }

    @覆盖 公共 int getItemCount() {

    switch (CURRENT_ADAPTER){
        case VIDEO_FILES_ADAPTER:
            return videoFiles.size();
        case COMMENT_ADAPTER:
            return comments.size();
        case QUESTIONS_ADAPTER:
            return questions.size();
    }
    
    return 0;
    

    }

    公共静态类 FilesViewHolder 扩展 RecyclerView.ViewHolder{

    private static final int VIDEO_FILES_ADAPTER = 1;
    private static final int COMMENT_ADAPTER = 2;
    private static final int QUESTIONS_ADAPTER = 3;
    
    private int CURRENT_ADAPTER;
    
    // Related to audio file class
    public TextView videoTitle, videoDescription, videoDate, videoUser, videoCount;
    
    // Related to comment class
    private TextView commentComment, commentUsername, commentCreatedAt;
    
    // Related to subscription class
    private TextView questionTitle;
    
    
    // @param isForUser applies only if CURRENT_ADAPTER == VIDEO_FILES_ADAPTER
    public FilesViewHolder(int CURRENT_ADAPTER, View itemView, boolean isForUser) {
        super(itemView);
    
        switch(CURRENT_ADAPTER){
    
            case VIDEO_FILES_ADAPTER:
    
                videoTitle = itemView.findViewById(R.id.tV_title);
                videoDescription = itemView.findViewById(R.id.tV_description);
                if(isForUser){
                    videoDate = itemView.findViewById(R.id.tV_date);
                }else{
                    videoUser = itemView.findViewById(R.id.tV_username);
                }
                videoCount = itemView.findViewById(R.id.tV_watched);
    
                break;
    
            case COMMENT_ADAPTER:
    
                commentComment = itemView.findViewById(R.id.tV_comment);
                commentUsername = itemView.findViewById(R.id.tV_comment_username);
                commentCreatedAt = itemView.findViewById(R.id.tV_comment_created_at);
    
                break;
    
            case QUESTIONS_ADAPTER:
    
                questionTitle = itemView.findViewById(R.id.tV_question);
    
                break;
        }
    
    }
    

    } }

还有另一种方法可以做到这一点。 每个列表都有一个适配器,例如:

public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentViewHolder>{

private List<Comment> commentList;

public CommentAdapter(List<Comment> comments){
    this.commentList = comments;
}

public static class CommentViewHolder extends RecyclerView.ViewHolder{

    private TextView comment, username, createdAt;

    public CommentViewHolder(View itemView) {
        super(itemView);

        comment = itemView.findViewById(R.id.tV_comment);
        username = itemView.findViewById(R.id.tV_comment_username);
        createdAt = itemView.findViewById(R.id.tV_comment_created_at);
    }
}

@NonNull
@Override
public CommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_comment, parent, false);

    return new CommentViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CommentViewHolder holder, int position) {
    holder.comment.setText(commentList.get(position).getComment());
    holder.username.setText(commentList.get(position).getUsername());
    holder.createdAt.setText(commentList.get(position).getCreatedAt());
}

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

}

我的问题是在性能方面什么会更好实施?如果我决定为不同的列表实现一个适配器,是否会出现任何明显的性能延迟或补丁?


无论您的布局和附加到单元的处理的复杂性如何,我都会建议您对每个列表使用单个适配器。

用一张小图来说明 RecyclerView 的主要操作:RecyclerView操作 https://i.stack.imgur.com/fS1UK.png

根据文档 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.AdapterRecyclerView.Adapter 的:方法createViewHolder()当必须创建新的可重用单元格时调用(取决于屏幕上可以显示的单元格数量)。因此,执行 if 语句不会对性能产生太大影响。onCreateViewHolder()如果屏幕上显示 10 个单元格,则可以调用 10 次以上。 问题可能出在onBindViewHolder()每次 RecyclerView 需要显示新单元格时都会调用该函数。因此,如果您有一个包含 100 个元素的列表,并且用户跳到底部,系统将比平常多执行 100 个 if 语句。

此外,我认为如果为每个列表创建单个适配器,您的代码将更易于维护。

我的结论是,我不太确定通过一个适配器来处理整个应用程序会降低系统的效率。性能损失不会很明显。我的意思是,最重要的一点是确保你的代码易于理解,否则你将来会在调试代码时浪费时间。我建议您通过在以下位置放置断点来测试 RecyclerView 生命周期onCreateViewHolder and onBindViewHolder(如果您好奇的话,还有更多)了解他们什么时候被调用。

我希望它对你有帮助! 祝你好运并享受你的应用程序的乐趣

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

多个适配器或一个适配器用于不同的列表和对象 - 代码性能 的相关文章

  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 有没有办法在Android上创建一个三角形按钮?

    有没有办法创建一个三角形的按钮 我知道我可以将三角形图像作为背景 但这将使三角形之外的区域可单击 有没有办法固定按钮角 X 和 Y 以便我可以将其变成三角形 您可以覆盖OnTouch http developer android com r
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • 如何在新标签 android webview 中打开链接? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经使用 webview 创建了一个 android 应用程序来显示我的网站 我什至想添加在新选项卡中打开链接的功能 但我找不到任何
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 如何使 tablayout 文本大小相等?

    这就是我所做的 我为文本创建了一种样式
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • 修改 ADW Android 启动器?

    我想更改和修改开源 ADW 启动器 启动器可在此处获取 https github com AnderWeb android packages apps Launcher https github com AnderWeb android p
  • 绘制大位图时 nSyncAndDrawFrame 速度极慢

    我想用多个大位图优化视差滚动视图 在我的 Nexus 5 上 一切都很顺利 Traceview 转储如下所示 doFrame 方法大约需要 18 毫秒才能完成 但是 当使用我的 Nexus 7 或 Android 6 模拟器 Genymot

随机推荐

  • 如何在 Fragment 中实现 Google 地图并使用 GoogleMap 对象?

    如何在Fragment中实现GoogleMap 我正在尝试开发同样的东西 但是 getMap 无法执行 因为 SupportMapFragment 执行行 SupportMapFragment getActivity getSupportF
  • ggplot2 中的密度图和直方图

    我有以下数据框 x1 lt data frame n rnorm 1000000 mean 0 sd 1 nombre x1 x2 lt data frame n rnorm 1500000 mean 3 sd 1 nombre x2 x
  • 带有符号链接的 CMake 文件(安装文件目标目录)

    我正在使用文件 安装文件 但有些文件是符号链接 我可以告诉 CMake 取消引用符号链接而不是在目标上创建符号链接吗 您可以在将文件传递给之前以编程方式取消引用文件install FILES set resolvedFiles foreac
  • 如何在 mailto 的正文中传递 URL

    我需要在正文中发送我的网站的 URL 以便邮件收件人可以单击该 URL 来加入我的网站 然而 目前邮件客户端呈现邮件的方式如下 链接在这里http www example com foo php this a http www exampl
  • Pod UDP 主机端口在 Docker Desktop 中不起作用

    我正在将 Docker Desktop for Windows 与 WSL2 结合使用 并尝试将以下部署部署到我的 Docker Desktop 的 Kubernetes 集群 apiVersion apps v1 kind Deploym
  • Netbeans 8.1 上的 Javascript es6 语法支持

    有谁知道 Netbeans 8 1 是否支持 es6 javascript 语法以及如何启用它 不 它在 8 2 中 NetBeans 8 2 候选版本可在以下位置获取https netbeans org downloads 8 2 rc
  • 软键盘仅在 EditText 焦点上显示一次

    谢谢阅读 我面临一个奇怪的问题 我的应用程序行为是这样的 当Activity开始 我requestFocus on an EditText并显示软键盘 但是 当我按后退按钮关闭键盘并点击EditText我再也没有弹出键盘 唯一的出路就是从头
  • 如何将Scrapy登录cookie传递给Selenium?

    我需要 Selenium 来进行 javascript 工作 首先我使用Scrapy登录FormRequest然后我需要打开response url与硒 问题是 Selenium 没有 cookie 因此它会打开登录页面 有谁知道如何将co
  • 如何在未越狱的iOS设备上直接从浏览器安装tongbu tui应用程序?

    一个人需要做的就是拿起一个普通的 iOS 设备并访问http tui tongbu com m iphone html http tui tongbu com m iphone html然后单击带有苹果徽标的灰色大按钮 然后单击安装 然后将
  • 允许Camel上下文永远运行

    我正在为 springCamelContext 使用camel spring jar 当我启动camel context时 它运行5分钟 默认时间 我可以让我的线程休眠一段特定的时间 即 try camelContext start Thr
  • jQuery Datatables AJAX 请求未正确命中 Web API

    我正在尝试整合ASP NET Web API 2 with jQuery 数据表 1 10 7 我想在我的数据表中使用服务器端处理 所以我使用了 Nuget 包数据表 AspNet WebApi2 这是我的 JavaScript
  • C++ 向外部程序提供输入和输出管道

    我正在尝试使用一些输入调用外部程序 并在程序中检索其输出 它将看起来像 一些输入 外部程序 检索输出 我首先想到使用popen 但这似乎是不可能的 因为管道不是双向的 有没有什么简单的方法可以处理这种事情linux 我可以尝试制作一个临时文
  • Transaction TimeOut EJB 对线程的影响

    关于EJB的一个问题 假设我有一个具有无限循环的会话 bean 它在 EJB 事务下运行 现在 当EJB的事务超时时 是否会导致无限循环线程中断或者容器将停止运行无限循环的线程 现在 当EJB的事务超时时 是否会导致无限循环线程中断或者容器
  • CSS 无法选择其中包含数字的类/id? [复制]

    这个问题在这里已经有答案了 为什么不能在 CSS 中使用数字 还有其他方法可以完成这项工作吗 我有以下代码 div class center 400 width div class Header div div class Content
  • 什么是“XCopy 版本”?

    我正在尝试下载 Oracle 数据访问组件 一些组件被命名为XCopy version 我知道XCopy http en wikipedia org wiki XCOPY是一个命令 但它在这种情况下到底意味着什么 它似乎指的是同一个Xcop
  • R矩阵行选择中的多个条件[重复]

    这个问题在这里已经有答案了 可能的重复 我有一个简单的问题 但我不知道如何解决这个问题 我想选择 value 1 gt 0 和 value 2 gt 0 的所有行 现在我有这个代码 dataOnBoth lt data data value
  • 如何在Android中实现“发送反馈”功能? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions I would like this
  • Scala 中的轻量级缓存解决方案?

    我只是想知道 Scala 中是否有可用的缓存解决方案 我正在寻找类似 Java 中的 Guava 提供的东西 我应该在 Scala 中使用 Guava 吗 Scalaz 中是否有包装器 皮条客或类似的东西 还有更适合 Scala 开发人员的
  • ionic2:浏览器中的地理位置失败并出现错误:异常:未捕获(承诺):false

    我正在使用 ionic2 的地理定位插件 当应用程序在浏览器中加载时 它会请求许可 但是当调用 getcurrentposition 时它并没有获取位置 我使用火狐浏览器 控制台日志显示错误 例外 未捕获 承诺 错误 我需要根据 getcu
  • 多个适配器或一个适配器用于不同的列表和对象 - 代码性能

    就性能而言 在 Android 应用程序中实现更好的选择是什么 每个具有不同对象列表的多个适配器 布局 处理不同数据的单个适配器 假设我们需要创建 评论 Videos 问题 适配器中的列表以正确显示数据 每个列表属于不同的布局 因此我们有不