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