Android ListView中设置的字体颜色显示错乱问题 && SparseArray<E>的使用

刚解决完ListView中的CheckBox选项位置错乱的问题,又出现了ListView中设置的字体颜色位置错乱的问题抓狂

先贴修改之前的代码(Adapter中的getView()方法):

        @Override
	public View getView(int position, View convertView, ViewGroup parent) {

		MultiSelLvOneViewHolder holder;
		if (convertView == null) {
			// 获得ViewHolder对象
			holder = new MultiSelLvOneViewHolder();
			// 导入布局并赋值
			convertView = mInflater.inflate(
					R.layout.acat_listitem_multi_select_level_one, null);
			holder.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
			holder.tvId = (TextView) convertView.findViewById(R.id.tvId);
			holder.ivRightArrow = (ImageView) convertView.findViewById(R.id.ivRightArrow);
			// 设置标签
			convertView.setTag(holder);
		} else {
			// 取出ViewHolder
			holder = (MultiSelLvOneViewHolder) convertView.getTag();
		}

		// 设置列表的显示信息
		Resources resource = (Resources) context.getResources();
		holder.tvInfo.setText(list.get(position)
				.get(CommonConstants.MULTI_SELECT_LIST_KEY_TITLE).toString());
		String id = list.get(position).get(CommonConstants.MULTI_SELECT_LIST_KEY_INFO)
				.toString();
		holder.tvId.setText(id);
		// 判断职业是否为总类别,总类别时隐藏右箭头,字体颜色变为橙色
		if (JobTypeUtils.isTotalJobType(id)) {
			holder.ivRightArrow.setVisibility(View.GONE);
			holder.tvInfo.setTextColor(resource.getColorStateList(R.color.deep_yellow));
		} else {
			holder.ivRightArrow.setVisibility(View.VISIBLE);
			holder.tvId.setTextColor(resource.getColorStateList(R.color.black));
		}

		return convertView;
	}
加粗部分为设置字体的颜色。。可是为神马不好使呢大哭

参考了各种资料,何种修改可惜都没用。。

最后参考了boylinux的文章,地址:http://blog.csdn.net/boylinux/article/details/8860443

添加一个SparseArray<View>用于缓存已经显示过的View,代码修改如下:

public class AcatMultiSelectLevelOneAdapter extends BaseAdapter {

	/* 稀疏数组:用于缓存已显示过的View */
	private SparseArray<View> viewArray = null;
	/* 填充数据列表 */
	private List<Map<String, Object>> list;
	/* 用来导入布局 */
	private LayoutInflater mInflater = null;
	/* 字体颜色 */
	private ColorStateList col1 = null;
	private ColorStateList col2 = null;

	// 构造器
	public AcatMultiSelectLevelOneAdapter(Context context, List<Map<String, Object>> list) {
		this.list = list;
		mInflater = LayoutInflater.from(context);
		col1 = context.getResources().getColorStateList(R.color.deep_yellow);
		col2 = context.getResources().getColorStateList(R.color.black);
		viewArray = new SparseArray<View>();
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		MultiSelLvOneViewHolder holder;
		if (viewArray.get(position, null) == null) {

			holder = new MultiSelLvOneViewHolder();
			// 导入布局控件
			convertView = mInflater.inflate(
					R.layout.acat_listitem_multi_select_level_one, null);
			holder.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
			holder.tvId = (TextView) convertView.findViewById(R.id.tvId);
			holder.ivRightArrow = (ImageView) convertView.findViewById(R.id.ivRightArrow);
			// 为控件赋值
			holder.tvInfo.setText(list.get(position)
					.get(CommonConstants.MULTI_SELECT_LIST_KEY_TITLE).toString());
			String id = list.get(position)
					.get(CommonConstants.MULTI_SELECT_LIST_KEY_INFO).toString();
			holder.tvId.setText(id);
			// 判断职业是否为总类别,总类别时隐藏右箭头,字体颜色变为橙色
			if (JobTypeUtils.isTotalJobType(id)) {
				holder.ivRightArrow.setVisibility(View.GONE);
				holder.tvInfo.setTextColor(col1);
			} else {
				holder.ivRightArrow.setVisibility(View.VISIBLE);
				holder.tvId.setTextColor(col2);
			}
			// 设置标签
			convertView.setTag(holder);
			// 保存View到缓存Map中
			viewArray.put(position, convertView);
		} else {
			// 从缓存Map取出View
			convertView = viewArray.get(position);
			// 取出标签的ViewHolder
			holder = (MultiSelLvOneViewHolder) convertView.getTag();
		}

		return convertView;
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
}


根据上述修改后,初次滑动ListView时都会新建一个View,然后把它放到缓存的SparseArray<View>中,虽然开始时会消耗一些内存,

但再次滑动显示时就可以拿到同一个的View实例,最最重要的是....显示的字体颜色不再错乱了!!!再次感谢boylinux~~


另外,关于SparseArray<E>的使用,我就直接复制别人的帖子了。。

原创帖子:http://liuzhichao.com/p/832.html

修改数据方法:

public void put(int key, E value)
public void setValueAt(int index, E value)

查找数据方法:

public E get(int key)
public E get(int key, E valueIfKeyNotFound)
其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。

其他方法就参考原帖吧。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。解决了:1. listview加载oom问题 2. listview加载时卡顿的现象 3. listview加载时item图片重复错位等情况 可以配置: 1. 设置加载图片的最大尺寸 2. 设置默认图片的显示 3. 设置图片位图模式 4. 设置内存缓存的最大值。 5. 文件缓存保存的目录   这个框架基本的代码是很久以前不知道哪里弄的,零零碎碎的,现在已经优化了很多,所以现在上传到github上共享。   讲讲使用方式吧:   首先使用前下载源码或者jar包(见github:https://github.com/wangjiegulu/ImageLoaderSample) 然后进行图片加载器(ImageLoader)的配置和初始化,推荐的方法如下: 新建MyApplication类,继承Application,在onCreate增加如下代码:/**  * Created with IntelliJ IDEA.  * Author: wangjie  email:[email protected]  * Date: 14-2-27  * Time: 上午11:25  */ public class MyApplication extends Application{     @Override     public void onCreate() {         super.onCreate();         ImageLoader.init(getApplicationContext(),                 new CacheConfig()                     .setDefRequiredSize(600) // 设置默认的加载图片尺寸(表示宽高任一不超过该值,默认是70px)                     .setDefaultResId(R.drawable.ic_launcher) // 设置显示的默认图片(默认是0,即空白图片)                     .setBitmapConfig(Bitmap.Config.ARGB_8888) // 设置图片位图模式(默认是Bitmap.CacheConfig.ARGB_8888)                     .setMemoryCachelimit(Runtime.getRuntime().maxMemory() / 3) // 设置图片内存缓存大小(默认是Runtime.getRuntime().maxMemory() / 4) //                  .setFileCachePath(Environment.getExternalStorageDirectory().toString()   "/mycache") // 设置文件缓存保存目录         );     }     …… }然后再AndroidManifest.xml添加:......到此,配置已经全部完成:接下来,使用ImageLoader来加载图片:holder.progress.setText("0%");     holder.progress.setVisibility(View.VISIBLE);     final ViewHolder vhr = holder;     ImageLoader.getInstances().displayImage(list.get(position), holder.image, new ImageLoader.OnImageLoaderListener() {         @Override         public void onProgressImageLoader(ImageView imageView, int currentSize, int totalSize) {             vhr.progress.setText(currentSize * 100 / totalSize   "%");         }         @Override         public void onFinishedImageLoader(ImageView imageView, Bitmap bitmap) {             vhr.progress.setVisibility(View.GONE);         }     });     或者:     ImageLoader.getInstances().displayImage(url, imageIv);     或者     ImageLoader.getInstances().displayImage(url, imageIv, 100);备注:例子,用到了一部分注解(与ImageLoader功能无关,但是可以简化代码的编写) 可以点下面连接进入:github:https://github.com/wangjiegulu/androidInject博客:http://www.cnblogs.com/tiantianbyconan/p/3459139.htmlhttp://www.cnblogs.com/tiantianbyconan/p/3540427.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值