ListView有多种Item View的优化

移动开发 Android
对于ListView 的优化,网上已经被讲解过很多,ListView的优化一般优化如下几点: (1)Item View重用优化(防内存溢出)(2)View查找优化(减少执行时间)(3)滑动优化,在滑动的时候加载图片数据等(防滑动卡顿),以上基本上是对应单ItemView进行的优化,对于多种ItemView的优化一般使用BaseAdapter给 提供的两个方法

对于ListView 的优化,网上已经被讲解过很多,ListView的优化一般优化如下几点:

  (1)Item View重用优化(防内存溢出)

  (2)View查找优化(减少执行时间)

  (3)滑动优化,在滑动的时候加载图片数据等(防滑动卡顿)

以上基本上是对应单ItemView进行的优化,对于多种ItemView的优化一般使用BaseAdapter给

提供的两个方法

getItemViewType():返回View类型,默认返回0

getViewTypeCount(): 返回有多少种类型的itemView,默认返回1

只有一种类型item view的话,是不需要重写这两个方法的。

如果有多个的时候,就需要重写这个方法了,并且返回的必须满足一下要求:

(1)getItemViewType()返回值必须大于等于0,并且小于类型的个数。为什么是这个范围,是因为

     在ListView里有一个数据,用来缓存已经使用过的Item View,详细信息自己看源码

(2)getViewTypeCount()这个方法的返回值就是你可能遇到的Item view类型的***个数,ListView会根据这个返回值

     去创建缓存数组

如果有两种View类型的话,直接在Adapter里面重写getView()方法就可以了,根据getItemViewType()返回值创建相应的View既可。

但是,如果有六个,七个怎么办?那么Adapter的getView()方法得写多少代码,到时候维护起来会多么麻烦,自己看自己写的还好,

如果换做别人呢?非常非常的痛苦.....

我在做我们的app的时候,就遇到了这样的问题,订单列表,每种订单所对应的Item View会有很大的区别,操作起来极为不方便,如有小的

改动都会耽误很长时间。新增类型也不好处理。

我针对遇到的问题进行了一个点点的优化,可以能不是***秀的,但是至少能解决以上问题,如果您能有更好的方式,也欢迎交流。

设计:

使用提供者的设计方式提供每种Item View,不同的ItemView会有不同的提供者,提供者需要实现一个接口:

  1. public interface IViewProvider { 
  2.     public abstract View getItemView(View convertView, LayoutInflater inflater, Object data); 

提供者只需要实现此接口,然后实现getItemView()方法,实现方式和Adapter的getView()的方式完全一样,减少了学习成本。

我还继承BaseAdapter专门实现了一个Adapter,名字叫MiltilViewListAdapter.java,实现了前面说的两个方法,和getView()方法

提供者只需要配置给MiltilViewListAdapter的实例即可。

一般情况下,都要传递给Adapter一个Bean集合,我的设计是,让这里面的bean都实现一个接口,用来标示它对应的哪个提供者。

使用方法:

  1. [mw_shl_code=java,true]private ListView mListView; 
  2.         private List<IItemBean> mList = new ArrayList<IItemBean>(); 
  3.         @Override 
  4.         protected void onCreate(Bundle savedInstanceState) { 
  5.                 super.onCreate(savedInstanceState); 
  6.                 setContentView(R.layout.activity_main); 
  7.                 createData(); 
  8.                 mListView = (ListView) findViewById(R.id.my_listview); 
  9.                 //不同之处在于多了一个provider集合,提供所有期望显示类型的provider class 
  10.                 //getView的实现在provider中实现,和在adapter中用法一样 
  11.                 List<Class<? extends IViewProvider>> providers = new ArrayList<Class<? extends IViewProvider>>(); 
  12.                 providers.add(FlightOrderViewProvider.class); 
  13.                 providers.add(SticketOrderViewProvider.class); 
  14.                 
  15.                 MiltilViewListAdapter adpater = new MiltilViewListAdapter(getApplication(), mList, providers); 
  16.                 mListView.setAdapter(adpater); 
  17.         }[/mw_shl_code] 

 本文链接:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=329890&extra=page%3D2%26filter%3Ddateline%26orderby%3Dlastpost%26dateline%3D604800&page=1

责任编辑:chenqingxiang 来源: eoeandroid
相关推荐

2015-10-22 10:59:13

ListViewItem刷新

2013-03-27 09:17:17

Android开发AndroidList

2012-12-26 15:19:09

Android开发ListView

2013-08-07 10:47:58

Android特效ListView

2013-08-07 10:35:02

AndroidListView拖拽

2014-12-17 09:46:30

AndroidListView最佳实践

2012-12-26 12:22:25

Android开发ListView布局

2014-07-15 17:17:31

AdapterAndroid

2013-09-17 14:00:19

AndroidListView原理

2009-09-08 14:43:41

C# listbox

2014-09-17 11:20:38

AndroidListView技巧

2010-06-13 15:42:37

MySQL性能优化

2010-06-03 09:39:24

优化MySQL性能

2012-11-14 11:07:24

网络优化

2016-04-12 10:07:55

AndroidViewList

2022-01-19 16:13:20

戴尔

2013-04-02 13:04:07

ListView平滑滚

2010-04-01 09:11:05

Oracle函数

2015-02-12 14:09:20

ListViewAndroid
点赞
收藏

51CTO技术栈公众号