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

我有一个列表视图,其中我为列表中的每个项目分配一个图像视图。问题是,我已经做到了应用程序一次只加载 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);

    }


我将解释这样我的代码不会令人困惑,我只是通过其属性为每个项目分配文本和图像视图,还有一个喜欢按钮和一个评论按钮,将用户带到评论页面。你们知道我能做什么吗?


四季花海
浏览 159回答 3
3回答

凤凰求蛊

您应该使用 ViewHolder链接在item_listview.xml中,如果设置了imageview的背景,去掉

一只斗牛犬

正如 Michael Butscher 已经提到的,你绝对应该看看 GamesLibrary 类。如果它是你的,你有机会通过将长时间运行的任务移动到后台线程而不是使用 UI 线程来改进很多。除此之外,我想给你一些代码风格的技巧。您可以使用 switch-block 而不是所有 else if 块。这将大大缩短您的代码并使其更具可读性。对于您经常使用的字符串或其他值并且不会改变使用常量。(例如,您所有的 SharedPreferences 键)当您必须更改其中一些值时,这将减少您的大量工作。您还应该在 getSharedPreferences() 中使用提供的常量,如 Context.MODE_PRIVATE。代码易读性。

慕田峪7331174

这可以通过View Holder 模式来改进。不要为每个项目填充新视图并进行所有样板设置,而是重用以前为现在不在可见区域的项目创建的视图。请注意,这已经回答了几次。看看以下问题和答案:Android listview 滞后于复杂的布局提高android listview刷新和滚动的性能优化listview性能Android我会改变其他事情以提高性能:删除对“正常”行为的异常使用。代码通常针对非异常流(需要引用)进行优化,因此经常遇到 catch 块可能是一个问题。从 切换SharedPreferences.Editor.commit()到SharedPreferences.Editor.apply()。基于文档commit()同步写入磁盘,而apply()仅写入内存结构并异步写入磁盘。这里的问题可能是您先创建侦听器,然后调用setChecked. 检查侦听器是否在被调用时setChecked被调用,并setChecked在代码中切换侦听器的创建和。看看长if ... else ... if是不是问题。试试地图。不要为每个新项目创建新的侦听器。每创建一次ViewHolder,将gl项目上的项设置ViewHolder为字段,并在侦听器中引用该字段。如果你想花哨,可以使用Android Profiler来衡量方法的性能,看看你大部分时间都花在了什么地方。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java