android listview 滑动卡顿问题解决

android listview 滑动卡顿问题解决之前在使用listview进行每次通知一来,根据判断是否有这个标志,就更新listview所绑定的数据源,通知更新priceAd.notifyDataSetChanged();,也用了网上的建议使用viewHolder进行listview的item复用机制,但还是会出现卡顿的现象,经过分析,原来是listview的item布局嵌套太多,导致刷新的时候,重绘过多,造成卡顿的现象,以下是另一片博客的分

大家好,又见面了,我是你们的朋友全栈君。

        之前在使用listview进行每次通知一来,根据判断是否有这个标志,就更新listview所绑定的数据源,通知更新priceAd.notifyDataSetChanged();,也用了网上的建议使用viewHolder进行listview的item复用机制,但还是会出现卡顿的现象,经过分析,原来是listview的item布局嵌套太多,导致刷新的时候,重绘过多,造成卡顿的现象,以下是另一片博客的分析贴出来,大家讨论感谢这位前辈:http://blog.csdn.net/knighttools/article/details/18259485:

解决与分析:
通过百度,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。
对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。

而为什么会有很多组次调用呢?

问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。

所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。

于是我们把listview与他父控件的所有高度与宽度都设置为fill_parent,果然getview调用正常了,注意是所有的高度和宽度!

当发现初始化adapter的时候正常调用之后,我们再来尝试滑动listview,发现每出现一个item,当前视图显示的item又调用了一次getview,通过刚哥的这篇帖子,定位到问题在我的getview中使用了// notifyDataSetChanged();   把这行去掉 listview 就已经宣告不再卡顿了!

附带刚哥的listview卡顿终极解决方案原帖:刚哥的Listview卡顿终极解决方案。

     根据他的提示,我的确发现自己的item的布局,嵌套了很多层的linearLayout,把它们删掉,改成权重布局,先前的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@color/background"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/price_quote_inst"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="25dp"
                android:layout_weight="1"
                android:gravity="right"
                android:singleLine="true"
                android:text="WYB/TEST"
                android:textColor="@color/white"
                android:textSize="20dp" >
            </TextView>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_gravity="bottom|right"
                android:layout_weight="2"
                android:gravity="bottom|right"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:text="時間:"
                    android:textColor="@color/white"
                    android:textSize="16dp" >
                </TextView>

                <TextView
                    android:id="@+id/price_quote_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:text="14:34:47"
                    android:textColor="@color/white"
                    android:textSize="16dp" >
                </TextView>
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/sellMktt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/pair_sell_select"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:gravity="center"
                    android:text="@string/activity_price_pricewarning_add4modify_sellprice"
                    android:textColor="@color/white" />

                <TextView
                    android:id="@+id/price_quote_sellprice"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:text="0.7023"
                    android:textSize="20dp"
                    android:textStyle="bold" />
            </LinearLayout>

            <TextView
                android:layout_width="2dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:id="@+id/buyMktt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/ordertrade_pair_buy_select"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:gravity="center"
                    android:text="@string/activity_price_pricewarning_add4modify_buyprice"
                    android:textColor="@color/gray" />

                <TextView
                    android:id="@+id/price_quote_buyprice"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:text="0.7023"
                    android:textSize="20dp"
                    android:textStyle="bold" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=":"
                android:textColor="@color/white"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/price_quote_low"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="0.6844"
                android:textColor="@color/white"
                android:textSize="14sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=":"
                android:textColor="@color/white"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/price_quote_updown"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="-1.91"
                android:textColor="@color/white"
                android:textSize="14sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:layout_weight="2"
                android:text=":"
                android:textColor="@color/white"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/price_quote_high"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:layout_weight="1"
                android:text="0.7130"
                android:textColor="@color/white"
                android:textSize="14sp" />
        </LinearLayout>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1.2px"
        android:layout_marginLeft="14dp"
        android:layout_marginRight="14dp"
        android:layout_marginTop="5dp"
        android:background="@color/white" />

    <TextView
        android:id="@+id/hidepricemenu"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:visibility="gone" />

</LinearLayout>

将android:layout_width都改成fill_parent,并且将linearLayout都删除掉,改成权重布局,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="10dp"
    android:background="@color/background"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/price_quote_inst"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="25dp"
                android:layout_weight="1"
                android:gravity="right"
                android:singleLine="true"
                android:text="WYB/TEST"
                android:textColor="@color/white"
                android:textSize="20dp" >
            </TextView>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_gravity="bottom|right"
                android:layout_weight="2"
                android:gravity="bottom|right"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:text="時間:"
                    android:textColor="@color/white"
                    android:textSize="16dp" >
                </TextView>

                <TextView
                    android:id="@+id/price_quote_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:singleLine="true"
                    android:text="14:34:47"
                    android:textColor="@color/white"
                    android:textSize="16dp" >
                </TextView>
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/sellMktt"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/pair_sell_select"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:gravity="center"
                    android:text="@string/activity_price_pricewarning_add4modify_sellprice"
                    android:textColor="@color/white" />

                <TextView
                    android:id="@+id/price_quote_sellprice"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:text="0.7023"
                    android:textSize="20dp"
                    android:textStyle="bold" />
            </LinearLayout>

            <TextView
                android:layout_width="2dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:id="@+id/buyMktt"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/ordertrade_pair_buy_select"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:gravity="center"
                    android:text="@string/activity_price_pricewarning_add4modify_buyprice"
                    android:textColor="@color/gray" />

                <TextView
                    android:id="@+id/price_quote_buyprice"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:text="0.7023"
                    android:textSize="20dp"
                    android:textStyle="bold" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text=":"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/price_quote_low"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="0.6844"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text=":"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/price_quote_updown"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="-1.91"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_weight="1"
            android:text=":"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/price_quote_high"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_weight="1"
            android:text="0.7130"
            android:textColor="@color/white"
            android:textSize="14sp" />
    </LinearLayout>

    <View
        android:layout_width="fill_parent"
        android:layout_height="1.2px"
        android:layout_marginLeft="14dp"
        android:layout_marginRight="14dp"
        android:layout_marginTop="5dp"
        android:background="@color/white" />

    <TextView
        android:id="@+id/hidepricemenu"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:visibility="gone" />

</LinearLayout>

    重启手机app,发现界面一点都不会卡了,所以接受一个教训就是布局如果要刷新的话,建议还是不要嵌套太多层,毕竟重绘很耗时间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163298.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于单片机的八路抢答器设计论文_抢答器的程序流程图

    基于单片机的八路抢答器设计论文_抢答器的程序流程图文末下载完整资料1.1八路扫描式抢答器的概述  本文介绍的八路数显抢答器具有电路简单、成本较低、操作方便、灵敏可靠等优点,经使用效果良好,具有较高的推广价值。无线遥控抢答器,它由8个发射器和1个接收器组成,可用于8组或8组以下的智力竞赛中。比赛前,将参赛组从0至7编号,每组发给对应的一个发射器。将接收器放于各组中央或前方。主持人按一下启动键后,抢答开始。此后,哪一组最先按下发射器上的抢答键,接收器就立即显示该组的组号并锁定,同时发出3次清脆的“叮咚”声。以后,按下任何一路抢答键均不起反映。只有主

    2022年10月20日
    0
  • java取余操作的坑

    java取余操作的坑%操作慎用!!!本人比赛时遇到的坑,简单的题但是时间超了publicstaticvoidmain(String[]args){//System.currentTimeMillis()//从1970年01月01日00时00分00秒000毫秒到此刻的毫秒数返回类型是long类型longtime=System.currentTimeMillis();inta=Integer.MAX_VALUE;for(inti=1;i&lt

    2022年6月7日
    49
  • ClassIn 退出专注学习模式 关闭专注学习模式「建议收藏」

    ClassIn 退出专注学习模式 关闭专注学习模式「建议收藏」ClassIn是一个常用的在线上课软件,从3.0.2.130开始推出了“专注学习模式”,窗口会全屏且不能切换窗口。可有时我们有其他需要,要退出专注学习模式,这时就要使用其它的方法了。这里提供一个我自己做的小程序。

    2022年5月24日
    101
  • cdr9导出对话框遮挡怎么办_sldprt文件ug怎么打开

    cdr9导出对话框遮挡怎么办_sldprt文件ug怎么打开说明因为之前旧项目采用的是MFC+BCG界面库的方法实现的。维护旧项目过程中,遇到选择文件对话框没有从默认位置选择的问题,学习和思考后,问题得到解决,特此记录。原来的BCG中配置选择的方法是这样的: lpszDefExt=_T(“DAT”); lpszFilter=_T(“文件|*.dat|\ 文件|*.bln|\ 文件|*.xyz|\ 文件|*.txt||”); m_editDataName.EnableFileBrowseButton(

    2022年10月8日
    0
  • HashMap遍历以及遍历顺序[通俗易懂]

    HashMap遍历以及遍历顺序[通俗易懂]HashMap遍历以及遍历顺序HashMap是Java语言中一种键值对(key-value)数据结构,但不记录key的插入顺序,如果要按照插入顺序进行遍历,则需要使用LinkedHashMap类型。本文将介绍下HashMap的三种遍历方式,LinkedHashMap遍历方式相同!(在leetcode12.整数转罗马数字题目中使用到HashMap遍历,遂做此记录!)HashMap结构定义如下:Map<Integer,String>map=newHashMap<Inte

    2022年9月9日
    0
  • 机器学习中常见的过拟合解决方法

    机器学习中常见的过拟合解决方法在机器学习中,我们将模型在训练集上的误差称之为训练误差,又称之为经验误差,在新的数据集(比如测试集)上的误差称之为泛化误差,泛化误差也可以说是模型在总体样本上的误差。对于一个好的模型应该是经验误差约等

    2022年8月5日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号