为了账号安全,请及时绑定邮箱和手机立即绑定

Listview 滞后,我无法解决这个问题

Listview 滞后,我无法解决这个问题

四季花海 2021-12-30 16:18:46
我有一个列表视图,其中我为列表中的每个项目分配一个图像视图。问题是,我已经做到了应用程序一次只加载 10 行,并且当用户滚动时项目会加起来,我启用了硬件加速,我将图片压缩并调整为很小的尺寸,但不管我做了什么列表视图仍然滞后。我试图在网上查找,但我无法意识到如何在我的场景中实现任何东西,或者还有什么可以加速这个过程。这是我的 BaseAdapter:  public View getView(int position, View convertView, ViewGroup parent) {    LayoutInflater layoutInflater = ((Activity)context).getLayoutInflater();    View view = layoutInflater.inflate(R.layout.library_layout, parent, false);    view.setBackgroundColor(Color.parseColor("#FFFFFF"));    final GamesLibrary gl = objects.get(position);    TextView title = (TextView)view.findViewById(R.id.titleId);    TextView excerpt = (TextView)view.findViewById(R.id.excerptId);    ImageView imageView = view.findViewById(R.id.listViewImageView);    ImageButton commBt = view.findViewById(R.id.goToCommLv);    final TextView author = view.findViewById(R.id.authorId);    final CheckBox likeBox = view.findViewById(R.id.likeIconLv);    ImageButton sharingButton = view.findViewById(R.id.shareButtonLv);    final SharedPreferences sp;    sp=context.getSharedPreferences("likes", 0);    final SharedPreferences.Editor editor = sp.edit();    String[] allFavsIds =SpIdstoArr(sp.getString("ids", ""));    final String id = String.valueOf(gl.getId());    SharedPreferences sp4 =context.getSharedPreferences("LocalLogInData", 0);    String uname= sp4.getString("Uname","dsufhsiudhfsdef");    if(gl.getTitle().contains(uname))    {        Log.d("aw12","aw12");        commBt.setClickable(false);        commBt.setEnabled(false);        commBt.setAlpha(0.5f);    }我将解释这样我的代码不会令人困惑,我只是通过其属性为每个项目分配文本和图像视图,还有一个喜欢按钮和一个评论按钮,将用户带到评论页面。你们知道我能做什么吗?
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

您应该使用 ViewHolder链接

在item_listview.xml中,如果设置了imageview的背景,去掉


查看完整回答
反对 回复 2021-12-30
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

正如 Michael Butscher 已经提到的,你绝对应该看看 GamesLibrary 类。如果它是你的,你有机会通过将长时间运行的任务移动到后台线程而不是使用 UI 线程来改进很多。

除此之外,我想给你一些代码风格的技巧。

  1. 您可以使用 switch-block 而不是所有 else if 块。这将大大缩短您的代码并使其更具可读性。

  2. 对于您经常使用的字符串或其他值并且不会改变使用常量。(例如,您所有的 SharedPreferences 键)当您必须更改其中一些值时,这将减少您的大量工作。

  3. 您还应该在 getSharedPreferences() 中使用提供的常量,如 Context.MODE_PRIVATE。代码易读性。


查看完整回答
反对 回复 2021-12-30
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

这可以通过View Holder 模式来改进。不要为每个项目填充新视图并进行所有样板设置,而是重用以前为现在不在可见区域的项目创建的视图。

请注意,这已经回答了几次。看看以下问题和答案:

我会改变其他事情以提高性能:

  • 删除对“正常”行为的异常使用。代码通常针对非异常流(需要引用)进行优化,因此经常遇到 catch 块可能是一个问题。

  • 从 切换SharedPreferences.Editor.commit()SharedPreferences.Editor.apply()。基于文档commit()同步写入磁盘,而apply()仅写入内存结构并异步写入磁盘。这里的问题可能是您先创建侦听器,然后调用setChecked. 检查侦听器是否在被调用时setChecked被调用,并setChecked在代码中切换侦听器的创建和。

  • 看看长if ... else ... if是不是问题。试试地图。

  • 不要为每个新项目创建新的侦听器。每创建一次ViewHolder,将gl项目上的项设置ViewHolder为字段,并在侦听器中引用该字段。

如果你想花哨,可以使用Android Profiler来衡量方法的性能,看看你大部分时间都花在了什么地方。


查看完整回答
反对 回复 2021-12-30
  • 3 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信