1. 程式人生 > >Android中BaseAdapter深入理解

Android中BaseAdapter深入理解

question:當一個列表有很多條資料的需要自定義adapter載入時,列表資料根據資料的屬性不同設定不同的顏色。程式碼例項如下:


 
@Override
     public View getView(int position, View convertView, ViewGroup parent) {
         ViewHolder holder = null;
        if (convertView == null) {
             convertView = mInflater.inflate(R.layout.item_listview, parent, false
); //載入佈局 holder = new ViewHolder(); holder.titleTv = (TextView) convertView.findViewById(R.id.titleTv); holder.descTv = (TextView) convertView.findViewById(R.id.descTv); holder.timeTv = (TextView) convertView.findViewById(R.id.timeTv); holder.phoneTv = (TextView) convertView.findViewById(R.id.phoneTv);
convertView.setTag(holder); } else { //else裡面說明,convertView已經被複用了,說明convertView中已經設定過tag了,即holder
             holder = (ViewHolder) convertView.getTag();
         }
 
         Bean bean = mDatas.get(position);
 if (bean.getPhone().equals(12345)) {
holder.phoneTv.setTextColor(Color.pasreColor("#674878"));
}else if(bean.getPhone().equals(56789) )
{
holder.phoneTv.setTextColor(Color.pasreColor("#124789"));
}
         holder.titleTv.setText(bean.getTitle());
         holder.descTv.setText(bean.getDesc());
        holder.timeTv.setText(bean.getTime());
         holder.phoneTv.setText(bean.getPhone());
 
         return convertView;
     }


如上所示程式碼,若第一頁面list載入了8個item,出現兩個12345的號碼,後面向下拉去資料,BaseAdapter會將上面滑過去的資料存到Adapter特定的記憶體中,下次載入資料直接使用上面劃過的資料記憶體物件。。此時如果第14條資料的載入正好使用的是第三條劃過的資料記憶體,恰巧第三條被設定了顏色,那麼此時使用第14條獲取bean.getPhone()

的資料為888888,沒有上述設定的equals等於這個數,那麼就不會設定顏色。此時會出現 這樣的情況:第十四條資料又是使用的第三條的資料記憶體,所以資料上面可能變化了,但是顏色不會變化,也就是第十四條資料的顏色是第三條資料的顏色,未改變正常的顏色。。


出現此情況的原因用專業的角度分析如下:

The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int)).

Android API是這麼說的。

就是BaseAdapter會使用記憶體複用來減少記憶體的使用。

Android中有個叫做Recycler的構件,它是用來儲存被劃過的item記憶體物件的。第一頁的listItem載入完,滑動後看不見的Item會被存在Recycler裡,接下來,就複用這些個item。達到減少記憶體消耗的目的。