listview的优化建议

转载请注明出处:http://blog.csdn.net/u014761700


1首先,虽然大家都知道,还是提一下,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View。ListView 中有一个回收器,Item 滑出界面的时候 View 会回收到这里,需要显示新的 Item 的时候,就尽量重用回收器里面的 View。
2利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView 的回收,当然类型不能太多;
3尽量让 ItemView 的 Layout 层次结构简单,这是所有 Layout 都必须遵循的;
善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
4尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
5每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item,特别推荐看一下这个文章:https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/
6为了保证 ListView 滑动的流畅性,getView() 中要做尽量少的事情,不要有耗时的操作。特别是滑动的时候不要加载图片,停下来再加载,这个库可以帮助你 Glide:https://github.com/bumptech/glide,

7使用 RecycleView 代替。 ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。

8Item中有三个按钮,这样设置监听

public MyAdapter () {
    myListener = new View.OnClickListener() {
        @override
        public void onClick(View v) {
            v.getTag()
            v.getId()
            //balabalabala...
        }
    });
}

通过传入的View v这个参数判断是哪一个button被点击,这样,无论View如何创建,你只创建了1个Listener对象,
如果想传item数据,可以将数据通过view 的tag带进来

public View getView(.....) {
....
v.setTag(key, getItem(position));
....
}

然后在listener中通过v.getTag()将数据取出。
或者是

class ViewHolder implements OnClickListener { 
      int position ; 
     TextView name ; 
     public void setPosition ( int position ){
                 this . position = position ; } 

  @Override public void onClick ( View v ) {
       switch ( v . getId ()){ 
                //XXXX } }
}

   public View getView ( int position , View convertView , ViewGroup parent ) { 
          ViewHolder holder = null ; 
      if ( convertView == null ) {
           convertView = inflater . inflate ( R . layout . list_item , parent , false );
          holder = new ViewHolder ();
          holder . name = ( TextView ) convertView . findViewById ( R . id . name );
          holder . name . setOnClickListener ( holder );
          convertView . setTag ( holder );  }
        else {
               holder = ( ViewHolder ) convertView . getTag (); 
               } //设置holder
       holder . name . setText ( list . get ( position ). partname ); //设置position holder . setPosition ( position );
      return convertView ;
       }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值