Adapter的getViewTypeCount和getItemViewType 使用
通过本篇文章,让你掌握新的技巧,请不用只看看一点,希望能够看完,让你很快明白不同的使用场景 ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。 一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能! 实际上Android为你缓存了视图。 Android中有个叫做Recycler的构件,下图是他的工作原理: 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。 ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。 请看下面的示例代码,这里在getView中使用了System.out进行输出 [?](http://www.aitinan.com/3885.html#) <table border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter"> <div class="line number1 index0 alt2"> 1 </div> <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> <div class="line number15 index14 alt2"> 15 </div> <div class="line number16 index15 alt1"> 16 </div> <div class="line number17 index16 alt2"> 17 </div> <div class="line number18 index17 alt1"> 18 </div> <div class="line number19 index18 alt2"> 19 </div> <div class="line number20 index19 alt1"> 20 </div> <div class="line number21 index20 alt2"> 21 </div> <div class="line number22 index21 alt1"> 22 </div> <div class="line number23 index22 alt2"> 23 </div> <div class="line number24 index23 alt1"> 24 </div> <div class="line number25 index24 alt2"> 25 </div> <div class="line number26 index25 alt1"> 26 </div> <div class="line number27 index26 alt2"> 27 </div> <div class="line number28 index27 alt1"> 28 </div> <div class="line number29 index28 alt2"> 29 </div> <div class="line number30 index29 alt1"> 30 </div> <div class="line number31 index30 alt2"> 31 </div> <div class="line number32 index31 alt1"> 32 </div> <div class="line number33 index32 alt2"> 33 </div> <div class="line number34 index33 alt1"> 34 </div> <div class="line number35 index34 alt2"> 35 </div> <div class="line number36 index35 alt1"> 36 </div> <div class="line number37 index36 alt2"> 37 </div> <div class="line number38 index37 alt1"> 38 </div> <div class="line number39 index38 alt2"> 39 </div> <div class="line number40 index39 alt1"> 40 </div> <div class="line number41 index40 alt2"> 41 </div> <div class="line number42 index41 alt1"> 42 </div> <div class="line number43 index42 alt2"> 43 </div> <div class="line number44 index43 alt1"> 44 </div> <div class="line number45 index44 alt2"> 45 </div> <div class="line number46 index45 alt1"> 46 </div> <div class="line number47 index46 alt2"> 47 </div> <div class="line number48 index47 alt1"> 48 </div> <div class="line number49 index48 alt2"> 49 </div> <div class="line number50 index49 alt1"> 50 </div> <div class="line number51 index50 alt2"> 51 </div> <div class="line number52 index51 alt1"> 52 </div> <div class="line number53 index52 alt2"> 53 </div> <div class="line number54 index53 alt1"> 54 </div> <div class="line number55 index54 alt2"> 55 </div> <div class="line number56 index55 alt1"> 56 </div> <div class="line number57 index56 alt2"> 57 </div> <div class="line number58 index57 alt1"> 58 </div> <div class="line number59 index58 alt2"> 59 </div> <div class="line number60 index59 alt1"> 60 </div> <div class="line number61 index60 alt2"> 61 </div> <div class="line number62 index61 alt1"> 62 </div> <div class="line number63 index62 alt2"> 63 </div> <div class="line number64 index63 alt1"> 64 </div> <div class="line number65 index64 alt2"> 65 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `MultipleItemsListextends ListActivity {` </div> <div class="line number2 index1 alt1"> ` ` </div> <div class="line number3 index2 alt2"> ` ``private` `MyCustomAdapter mAdapter;` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> ` ``@Override` </div> <div class="line number6 index5 alt1"> ` ``public` `void` `onCreate(Bundle savedInstanceState) {` </div> <div class="line number7 index6 alt2"> ` ``super``.onCreate(savedInstanceState);` </div> <div class="line number8 index7 alt1"> ` ``mAdapter = ``new` `MyCustomAdapter();` </div> <div class="line number9 index8 alt2"> ` ``for` `(``int` `i = ````; i < ``50``; i++) {` </div> <div class="line number10 index9 alt1"> ` ``mAdapter.addItem(``"item "` `+ i);` </div> <div class="line number11 index10 alt2"> ` ``}` </div> <div class="line number12 index11 alt1"> ` ``setListAdapter(mAdapter);` </div> <div class="line number13 index12 alt2"> ` ``}` </div> <div class="line number14 index13 alt1"> ` ` </div> <div class="line number15 index14 alt2"> ` ``private` `class` `MyCustomAdapterextends BaseAdapter {` </div> <div class="line number16 index15 alt1"> ` ` </div> <div class="line number17 index16 alt2"> ` ``private` `ArrayList mData = ``new` `ArrayList();` </div> <div class="line number18 index17 alt1"> ` ``private` `LayoutInflater mInflater;` </div> <div class="line number19 index18 alt2"> ` ` </div> <div class="line number20 index19 alt1"> ` ``public` `MyCustomAdapter() {` </div> <div class="line number21 index20 alt2"> ` ``mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);` </div> <div class="line number22 index21 alt1"> ` ``}` </div> <div class="line number23 index22 alt2"> ` ` </div> <div class="line number24 index23 alt1"> ` ``public` `void` `addItem(``final` `String item) {` </div> <div class="line number25 index24 alt2"> ` ``mData.add(item);` </div> <div class="line number26 index25 alt1"> ` ``notifyDataSetChanged();` </div> <div class="line number27 index26 alt2"> ` ``}` </div> <div class="line number28 index27 alt1"> ` ` </div> <div class="line number29 index28 alt2"> ` ``@Override` </div> <div class="line number30 index29 alt1"> ` ``public` `int` `getCount() {` </div> <div class="line number31 index30 alt2"> ` ``return` `mData.size();` </div> <div class="line number32 index31 alt1"> ` ``}` </div> <div class="line number33 index32 alt2"> ` ` </div> <div class="line number34 index33 alt1"> ` ``@Override` </div> <div class="line number35 index34 alt2"> ` ``public` `String getItem(``int` `position) {` </div> <div class="line number36 index35 alt1"> ` ``return` `mData.get(position);` </div> <div class="line number37 index36 alt2"> ` ``}` </div> <div class="line number38 index37 alt1"> ` ` </div> <div class="line number39 index38 alt2"> ` ``@Override` </div> <div class="line number40 index39 alt1"> ` ``public` `long` `getItemId(``int` `position) {` </div> <div class="line number41 index40 alt2"> ` ``return` `position;` </div> <div class="line number42 index41 alt1"> ` ``}` </div> <div class="line number43 index42 alt2"> ` ` </div> <div class="line number44 index43 alt1"> ` ``@Override` </div> <div class="line number45 index44 alt2"> ` ``public` `View getView(``int` `position, View convertView, ViewGroup parent) {` </div> <div class="line number46 index45 alt1"> ` ``System.out.println(``"getView "` `+ position + ``" "` `+ convertView);` </div> <div class="line number47 index46 alt2"> ` ``ViewHolder holder = ``null``;` </div> <div class="line number48 index47 alt1"> ` ``if` `(convertView == ``null``) {` </div> <div class="line number49 index48 alt2"> ` ``convertView = mInflater.inflate(R.layout.item1, ``null``);` </div> <div class="line number50 index49 alt1"> ` ``holder = ``new` `ViewHolder();` </div> <div class="line number51 index50 alt2"> ` ``holder.textView = (TextView)convertView.findViewById(R.id.text);` </div> <div class="line number52 index51 alt1"> ` ``convertView.setTag(holder);` </div> <div class="line number53 index52 alt2"> ` ``}``else` `{` </div> <div class="line number54 index53 alt1"> ` ``holder = (ViewHolder)convertView.getTag();` </div> <div class="line number55 index54 alt2"> ` ``}` </div> <div class="line number56 index55 alt1"> ` ``holder.textView.setText(mData.get(position));` </div> <div class="line number57 index56 alt2"> ` ``return` `convertView;` </div> <div class="line number58 index57 alt1"> ` ``}` </div> <div class="line number59 index58 alt2"> ` ` </div> <div class="line number60 index59 alt1"> ` ``}` </div> <div class="line number61 index60 alt2"> ` ` </div> <div class="line number62 index61 alt1"> ` ``public` `static` `class` `ViewHolder {` </div> <div class="line number63 index62 alt2"> ` ``public` `TextView textView;` </div> <div class="line number64 index63 alt1"> ` ``}` </div> <div class="line number65 index64 alt2"> `}` </div> </div> </td> </tr> </table> </div> </div> </div> 执行程序,然后在Logcat中查看日志 ...