Android中BaseAdapter深入理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ruizhenggang/article/details/78916428

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。达到减少内存消耗的目的。


猜你喜欢

转载自blog.csdn.net/ruizhenggang/article/details/78916428
今日推荐