android BaseAdapter多布局緩衝

來源:互聯網
上載者:User

android BaseAdapter多布局緩衝

 ListView是App開發中最常見的控制項之一了,與之相隨的則是BaseAdapter的使用,BaseAdapter的作用則是為我們的ListView提供資料來源,普通的用法相信大家都會用,今天主要說明一下,列表中如果有多種樣式的ItemView時,應該如何去高效的載入.

 先看一下:

 

 :整個列表中存在著兩種樣式的ItemView,開始用傳統的ConvertView去緩衝子項時,發現兩種布局一滑動就出現了錯亂,後來為了項目進度,看到沒有發生記憶體溢出後就沒有用ConvertView做子View的緩衝,今天在翻看Adapter及其子類的源碼時發現,如下代碼,瞬間想到之前沒有對多布局多緩衝的問題,於是上網查看了一下,果然就是用這幾個方法去實現,代碼如下:

 

public interface Adapter {     void registerDataSetObserver(DataSetObserver observer);    void unregisterDataSetObserver(DataSetObserver observer);    int getCount();         Object getItem(int position);        long getItemId(int position);        boolean hasStableIds();        View getView(int position, View convertView, ViewGroup parent);   static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;        int getItemViewType(int position);  //方法一,得到布局類型         int getViewTypeCount();       // 方法二,得到布局總        static final int NO_SELECTION = Integer.MIN_VALUE;      /**      * @return true if this adapter doesn't contain any data.  This is used to determine      * whether the empty view should be displayed.  A typical implementation will return      * getCount() == 0 but since getCount() includes the headers and footers, specialized      * adapters might want a different behavior.      */     boolean isEmpty();}

  就是紅色注釋出的兩個方法,而BaseAdapter已經幫我們提供了預設的實現,才使得我們沒有關注到這兩個方法,BaseAdapter的預設實現如下:

 

 

package android.widget;import android.database.DataSetObservable;import android.database.DataSetObserver;import android.view.View;import android.view.ViewGroup;public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {    private final DataSetObservable mDataSetObservable = new DataSetObservable();    public boolean hasStableIds() {        return false;    }        public void registerDataSetObserver(DataSetObserver observer) {        mDataSetObservable.registerObserver(observer);    }    public void unregisterDataSetObserver(DataSetObserver observer) {        mDataSetObservable.unregisterObserver(observer);    }       public void notifyDataSetChanged() {        mDataSetObservable.notifyChanged();    }        public void notifyDataSetInvalidated() {        mDataSetObservable.notifyInvalidated();    }    public boolean areAllItemsEnabled() {        return true;    }    public boolean isEnabled(int position) {        return true;    }    public View getDropDownView(int position, View convertView, ViewGroup parent) {        return getView(position, convertView, parent);    }    public int getItemViewType(int position) {        return 0;    }    public int getViewTypeCount() {        return 1;    }        public boolean isEmpty() {        return getCount() == 0;    }}
 有了這兩個方法後,我們只需重寫這兩個方法即可,下面是我重寫的Adapter代碼:

 

 

/********************************************************** * @檔案名稱:CountryListAdapter.java * @檔案作者:rzq * @建立時間:2014年7月22日 下午2:33:43 * @檔案描述:國家列表適配器 * @修改曆史:2014年7月22日建立初始版本 **********************************************************/public class CountryListAdapter extends BaseAdapter {private Context mContext;private ArrayList dataList;private Country country;private ViewHolder holder1;private ViewHolder holder2;public CountryListAdapter(Context context, ArrayList dataList) {this.mContext = context;this.dataList = dataList;}@Overridepublic int getCount() {return dataList.size();}@Overridepublic Object getItem(int position) {return dataList.get(position);}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {country = (Country) dataList.get(position);int type = getItemViewType(position);if (convertView == null) {switch (type) {case 0:holder1 = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.catagories_expandlistview_group,parent, false);holder1.textView = (TextView) convertView.findViewById(R.id.catagories_group_textview);convertView.setTag(holder1);break;case 1:holder2 = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.register_expandlistview_child, parent, false);holder2.textView = (TextView) convertView.findViewById(R.id.register_child_textview);holder2.imageView = (ImageView) convertView.findViewById(R.id.register_country_flag);convertView.setTag(holder2);break;}} else {switch (type) {case 0:holder1 = (ViewHolder) convertView.getTag();break;case 1:holder2 = (ViewHolder) convertView.getTag();break;}}switch (type) {case 0:holder1.textView.setText(country.getIndexChar());break;case 1:holder2.textView.setText(country.getCountryName());holder2.imageView.setImageDrawable(country.getFlagDrawable());break;}return convertView;}@Overridepublic int getItemViewType(int position) {country = (Country) getItem(position);if (country.isGroup()) {return 0;} else {return 1;}}@Overridepublic int getViewTypeCount() {return 2;}private static class ViewHolder {private TextView textView;private ImageView imageView;}}
這樣確保了記憶體不會溢出.也可以提高ListView的載入效率.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.