最近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. json转成java对象

    avro生成的代码里,String是CharSequence,不能通过Gson反序列化,于是有了下面的代码,ParseArray里还不完善: static <T> List<T> ...

  2. Codeforces Round #392 (Div. 2)-D. Ability To Convert

    D - Ability To Convert 题目大意:给你一个数字 n 接下来再输入一个数字 w(<10^60),表示w这个数字是 n 进制的, 并且超过十进制也用数字表示,这样就有多种组合了 ...

  3. linux下php命令无法使用如何解决

    本文主要和大家分享linux下php命令无法使用如何解决,测试是否添加php环境变量方法: 如下:输入php -v 显示 php 命令没有找到 [root@iz8vbhc4d7zoazstpw7gw8 ...

  4. python tkinter-容器、子窗体

      Frame f = tkinter.Frame(width=380, height=270, bg='white').pack() LabelFrame f = tkinter.LabelFram ...

  5. 在python3下使用requests,xpath,urllib爬取不得姐网站相关视频爬虫源代码

    #coding=utf-8 from lxml import etreeimport requestsimport urllibimport os # 获取url的html等内容def getHtml ...

  6. x,y

    x,y在二维里,横纵坐标容易反,有关处理要小心.

  7. iOS 技术篇:如何处理多个网络请求的先后(依赖)关系

    在开发过程中,不知你有没有碰到过在一个页面 用到了多个网络请求,而且根据业务需求,需要有次序的执行A B C 网络请求? 你可能会想到,我在A的请求成功回调里去处理B,在B的回调里去请求C,但你后来会 ...

  8. 解决iframe重复嵌套登陆页面的问题

    在login.jsp中加入即可 // 在被嵌套时就刷新上级窗口 if(window.parent != window){ window.parent.location.reload(true); }

  9. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  10. C++的多态

    继承.封装.多态是面向对象编程最主要的三个特征,有人说多态是理解C++最难理解的一部分,其实我觉得单单从技术上讲,多态并不难,难的是你需要懂得在何时使用多态,就像封装一样,封装本身不难,难的是你对整个 ...