其實這裡的複用技術在列表中是十分常見的,iphone中的tableView也有相關的技術,cell的複用
工作原理:
- 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進行輸出
public class MultipleItemsList extends ListActivity { private MyCustomAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new MyCustomAdapter(); for (int i = 0; i < 50; i++) { mAdapter.addItem("item " + i); } setListAdapter(mAdapter); } private class MyCustomAdapter extends BaseAdapter { private ArrayList mData = new ArrayList(); private LayoutInflater mInflater; public MyCustomAdapter() { mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addItem(final String item) { mData.add(item); notifyDataSetChanged(); } @Override public int getCount() { return mData.size(); } @Override public String getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView " + position + " " + convertView); ViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.item1, null); holder = new ViewHolder(); holder.textView = (TextView)convertView.findViewById(R.id.text); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } } public static class ViewHolder { public TextView textView; }}
幾個item初始之後就不會調用執行個體化convertView 的函數的,if (convertView == null)裡面的不再執行,所以應該在其外設定資料以及相應的監聽。
注意:
convertview是R.layout.item1中最外面的layout
本文參考:
[Android] ListView中getView的原理+如何在ListView中放置多個item