• Android开发——ListView使用技巧总结(一)


    1.  ViewHolder

    感觉ViewHolder就不用多说了吧,这是ListView最基本的优化技巧了。ViewHolder机制使getView()中避免了每次都要进行findViewById()去实例化控件,通过视图缓存机制重用缓存即可。

    在后面ListView加载不同布局中也用到了ViewHolder机制,所以示例代码就不单独贴了。

     

    2. 不要在getView()中进行耗时操作

    1)在getView()中进行耗时操作会造成卡顿,因此诸如加载图片这一类耗时操作,需要用异步的方式处理耗时任务

    2)还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来。

    //判断列表的状态
    public void onScrollStateChange(AbsLiatView view, int scrollState){
      if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
        mIsViewIdle = true;
       }else{
          mIsViewIdle = false;
        }
    }
    //在getView()中根据列表状态选择在静止时加载图片
    if(mIsViewIdle = true){
      imageView.setTag(url);
      //通过url异步加载图片到imageView
    }
    

    3.  开启硬件加速

    Android3.0开始,Android2D显示管道被被设计得更加支持硬加速了,硬加速使用GPU承担了所有在Viewcanvas上执行的绘制操作。有些莫名其妙的卡顿现象可以通过Activity开启硬件加速来优化,在Manifest中的<activity>标签下进行如下设置。

    andorid:hardwareAccelerated=”true”

    还可以在运行时使用以下代码禁止个别的View的硬加速,因为硬件加速可能在自定义View出问题。

    if(myView.isHardwareAccelerated()){
        myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
    }
    

    4.  如何实现ListView中具有不同的布局

    我之前做过一个聊天界面,每个ListViewItem都具有A方和B方的所有布局信息,只是在合适的时候hide掉某一方而已,但是后来发现了一个机智的官方也考虑到了这种情况,并推出了两个方法,专门来解决这个问题,这里总结一下。

    @Override
    public int getItemViewType(int position) {
         return type;
    }
    
    @Override
    public int getViewTypeCount() {
         return number;
    }
    

    上面两个方法,getItemViewType()用来返回第position个条目是何种类型,而getViewTypeCount()则返回不同布局的总数。结合这两种方法,即可在getView中进行灵活判断加载不同的布局了。

    下面是实现简单的聊天对话的例子,主要是ListView的部分:

    public class ChatItemListViewAdapter extends BaseAdapter {
        private List<ChatItemListViewBean> mData;
        private LayoutInflater mInflater;
    
        public ChatItemListViewAdapter(Context context, List<ChatItemListViewBean> data) {
            this.mData = data;
            mInflater = LayoutInflater.from(context);
        }
    
        @Override
        public int getCount() {
            return mData.size();
        }
    
        @Override
        public Object getItem(int position) {
            return mData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getItemViewType(int position) {
            ChatItemListViewBean bean = mData.get(position);
            return bean.getType();
        }
    
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                if (getItemViewType(position) == 0) {
                    holder = new ViewHolder();
                    convertView = mInflater.inflate(R.layout.chat_item_itemin, null);
                    holder.icon = (ImageView) convertView.findViewById(R.id.icon_in);
                    holder.text = (TextView) convertView.findViewById(R.id.text_in);
                } else {
                    holder = new ViewHolder();
                    convertView = mInflater.inflate(R.layout.chat_item_itemout, null);
                    holder.icon = (ImageView) convertView.findViewById(R.id.icon_out);
                    holder.text = (TextView) convertView.findViewById(R.id.text_out);
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.icon.setImageBitmap(mData.get(position).getIcon());
            holder.text.setText(mData.get(position).getText());
            return convertView;
        }
    
        public final class ViewHolder {
            public ImageView icon;
            public TextView text;
        }
    }
    

    其中getViewTypeCount()返回了布局总数为两种,getItemViewType()则实时返回某条目的类型,从而在getView中加载不同的布局,类型信息使用Bean类存储,并在Activity中进行数据的初始化。其中可以看到ViewHolder内部类的应用,在getView中首先会判断convertView是否为空,若为空才去重新加载布局,否则使用缓存。

    效果图如下所示,源码地址点击下载


    最后在下二篇Android开发——ListView使用技巧总结(二)中介绍一下如何在合适的时候隐藏Toolbar,还有如何实现具有弹性的ListView。

  • 相关阅读:
    Django的路由层(URLconf)
    Django简介
    web应用和http协议
    浅谈css中浮动和清除浮动带来的影响
    Bootstrap组件介绍
    jquery的Ajax
    spark新能优化之广播共享数据
    spark新能优化之reduceBykey和groupBykey的使用
    spark新能优化之shuffle新能调优
    spark新能优化之数据本地化
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461441.html
Copyright © 2020-2023  润新知