最近android的listview写多了,也学习了各种listview的优化,列如viewHolder的使用。今天做item颜色设置时遇到一个新的问题。我这里设置“未完成”是灰色的,“已完成”是蓝色。我在item.xml设置所有字体都是灰色的,然后在viewholder设置颜色变化,当为“已完成”时设置为蓝色,这样的逻辑似乎一切正常,但当我测试时滑动listview,下面的“未完成”居然变成蓝色的!!!以下是Adapter的代码

public class ToneListAdapter extends ArrayAdapter<ToneList> {

private int resource;
public ToneListAdapter(Context context, int resource, List<ToneList> objects) {
super(context, resource, objects);
// TODO Auto-generated constructor stub
this.resource = resource;//resource为listView的每个子项的布局id

}
View view;
ViewHolder viewHolder;
if(convertView==null){
view = LayoutInflater.from(getContext()).inflate(resource, null);
viewHolder = new ViewHolder();
viewHolder.toneTitle =(TextView) view.findViewById(R.id.tv_tone_title);
viewHolder.toneTime =(TextView) view.findViewById(R.id.tv_tone_time);
viewHolder.toneFinish = (TextView) view.findViewById(R.id.tv_tone_finish);
viewHolder.toneBeginStudy = (ImageView) view.findViewById(R.id.img_tone_beginStudy);
viewHolder.toneLookResult = (ImageView) view.findViewById(R.id.img_tone_lookresult);
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}

final ToneList classList = getItem(position);//获得实例,final才能被onclick等内部类引用,position需要被引用也需要加final
if(classList!=null){
viewHolder.toneTitle.setText(classList.getTitle());
viewHolder.toneTime.setText(classList.getTime());
viewHolder.toneFinish.setText(classList.getFinish());
if(classList.getFinish().equals("已完成")){
//setTextColor(R.color.finish_blue)无效
viewHolder.toneFinish.setTextColor(getContext().getResources().getColor(R.color.finish_blue));//没作用?
}
//进入学习监听器
viewHolder.toneBeginStudy.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getContext(), classList.getTitle()+"begin study", Toast.LENGTH_SHORT).show();
}
});
//查看成绩监听器
viewHolder.toneLookResult.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getContext(), classList.getTitle()+"LookResult", Toast.LENGTH_SHORT).show();
}
});
}

return view;

}

这是为什么?后来我查了listView滑动的机制才发现:listView被滑动时,移出视图的item会被缓存下来,下面的item会复用移出的item的样式!我的解决方法是:也设置未完成的颜色。这样每次getView就会重新设置一次。

if(classList.getFinish().equals("已完成")){
//setTextColor(R.color.finish_blue)无效
viewHolder.toneFinish.setTextColor(getContext().getResources().getColor(R.color.finish_blue));//没作用?
}

else{//一定要写else设置未完成,不然当滑动列表时,会有背景色错位
viewHolder.toneFinish.setTextColor(getContext().getResources().getColor(R.color.finish_No));
}

android listview优化:滑动时颜色错乱问题的更多相关文章

  1. $ListView的优化机制和滑动时数据错乱的讨论

    Refer:http://www.myexception.cn/mobile/1612364.html (一)Android ListView的基本用法 1.创建一个实体类Person,为其添加Get ...

  2. Android 去掉ScrollView、GridView、ListView向上 滑动时顶部的投影/阴影

    在ScrollView.GridView.ListView向上滑动的过程中,这些控件的顶部会出现一个系统默认的白色阴影,有些时候这个白色的阴影看上去好看,那么就需要除去. 去掉方法:在ScrollVi ...

  3. listView解决滑动时黑色背景问题

    listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...

  4. Android——ListView优化

    1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...

  5. android listview 优化

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android convertview作用 ======= 1,convertView复 ...

  6. android ListView 在初始化时多次调用getView()原因分析

    今天在做一个功能:在初始化ListView时,把第一行背景置为黄色,同时保存第一行对象,用于在点击其他行时将该行重新置为白色. if(position==0){ convertView.setBack ...

  7. listview选中滑动时背景变黑

    喵的今天调这个一直以为是背景色的问题,花了好多时间 下面才是解决方法:转自:http://daijun74.iteye.com/blog/1175143 手指在ListView上下滚动时,ListVi ...

  8. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  9. Android ListView无数据项时提示

    只需要调用在代码中调用setEmptyView(View emptyView)设置ListView为空时显示这个TextView即可. 布局文件 <?xml version="1.0& ...

随机推荐

  1. HTML&CSS学习笔记

    <table> <thead> <tr>            // table row <th></th> // table head & ...

  2. java.lang.NumberFormatException: multiple points问题

    一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的Simp ...

  3. java面试题大全-基础方面 答案自己写

    Java基础方面: 1.作用域public,private,protected,以及不写时的区别 2.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类, ...

  4. 自适应阈值二值化之最大类间方差法(大津法,OTSU)

    最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间 ...

  5. 类 __new__方法实现单例

    继承了单例的类,子类也是单例模式

  6. 康托展开&&康托逆展开

    康托展开 简介:对于给定的一个排列,求它是第几个,比如54321是n=5时的第120个.(对于不是1~n的排列可以离散化理解) 做法: ans=a[n]*(n-1)!+a[n-1]*(n-2)!+~~ ...

  7. [Web安全] XXE漏洞攻防学习(上)

    0x00.XXE漏洞 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶 ...

  8. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  9. [CC-PERMUTE]Just Some Permutations 3

    [CC-PERMUTE]Just Some Permutations 3 题目大意: \(T(T\le10^5)\)次询问,每次询问有多少长度为\(n(n\le10^6)\)的排列,满足任意相邻两个数 ...

  10. BZOJ3019 : [Balkan2012]handsome

    首先预处理出$f[i][j][k]$表示长度为$i$的序列,第一个位置是$j$,最后一个位置是$k$时合法的方案数. 从后往前枚举LCP以及那个位置应该改成什么. 用线段树维护区间内最左最右的已经确定 ...