zoukankan      html  css  js  c++  java
  • 安卓中listview中性能优化的处理

    1.在adapter中的getView方法中尽量少使用逻辑

    不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方。比如:

    优化前的getView():

    @Override
    public View getView(int position, View convertView, ViewGroup paramViewGroup) {
            Object current_event = mObjects.get(position);
            ViewHolder holder = null;
            if (convertView == null) {
                    holder = new ViewHolder();
                    convertView = inflater.inflate(R.layout.row_event, null);
                    holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
                    holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
                    convertView.setTag(holder);
    
            } else {
                    holder = (ViewHolder) convertView.getTag();
            }
    
           //在这里进行逻辑推断。这是有问题的 
            if (doesSomeComplexChecking()) {
                    holder.ThreeDimention.setVisibility(View.VISIBLE);
            } else {
                    holder.ThreeDimention.setVisibility(View.GONE); 
            }
    
            // 这是设置image的參数,每次getView方法运行时都会运行这段代码。这显然是有问题的
            RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
            holder.EventPoster.setLayoutParams(imageParams);
    
            return convertView;
    }
    

      

    优化后的getView():

    @Override
    public View getView(int position, View convertView, ViewGroup paramViewGroup) {
        Object object = mObjects.get(position);
        ViewHolder holder = null;
    
        if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.row_event, null);
                holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
                holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
                //设置參数提到这里,仅仅有第一次的时候会运行,之后会复用 
                RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
                holder.EventPoster.setLayoutParams(imageParams);
                convertView.setTag(holder);
        } else {
                holder = (ViewHolder) convertView.getTag();
        }
    
        // 我们直接通过对象的getter方法取代刚才那些逻辑推断。那些逻辑推断放到别的地方去运行了
        holder.ThreeDimension.setVisibility(object.getVisibility());
    
        return convertView;
    }
    

      

    2.载入图片

    假设你的ListView中须要显示从网络上下载的图片的话。

    我们不要在ListView滑动的时候载入图片,那样会使ListView变得卡顿,所以我们须要再监听器里面监听ListView的状态。

    假设滑动的时候,停止载入图片,假设没有滑动,则开始载入图片

    listView.setOnScrollListener(new OnScrollListener() {
    
                @Override
                public void onScrollStateChanged(AbsListView listView, int scrollState) {
                        //停止载入图片 
                        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
                                imageLoader.stopProcessingQueue();
                        } else {
                        //開始载入图片
                                imageLoader.startProcessingQueue();
                        }
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                        // TODO Auto-generated method stub
    
                }
        });
    

      

    3.将ListView的scrollingCache和animateCache设置为false

    scrollingCache: 能够让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,

    是从cache中取出。默认情况下drawing cahce是禁用的。由于它太耗内存了,可是它确实比重画更加平滑。

    而在ListView中,scrollingCache是默认开启的,我们能够手动将它关闭。

    animateCache: ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们能够手动将它关闭掉

    优化前的ListView

    <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:cacheColorHint="#00000000"
            android:divider="@color/list_background_color"
            android:dividerHeight="0dp"
            android:listSelector="#00000000"
            android:smoothScrollbar="true"
    

      

    优化后的ListView

    <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:divider="@color/list_background_color"
            android:dividerHeight="0dp"
            android:listSelector="#00000000"
            android:scrollingCache="false"
            android:animationCache="false"
            android:smoothScrollbar="true"
            android:visibility="gone" />
    

      

    4.降低item的布局的深度

    说白了就是减少更多的嵌套布局

    5.使用ViewHolder

    这个大家都不用赘述了,基本上都在用

    by 磊磊tua

  • 相关阅读:
    内置对象
    Angular 动画
    Angular_上拉刷新
    angular Observable
    【Nginx】nginx为目录或网站加上密码认证
    MongoDB笔记
    websocket服务器+客户端
    cli 中php的配置和phpinfo不一样
    linux设置时区和自动同步时间
    crontab & php实现多进程思路
  • 原文地址:https://www.cnblogs.com/widgetbox/p/11274557.html
Copyright © 2011-2022 走看看