因为项目中有这样的需求:一般消息类或者资讯类的界面,都有类似于网易客户端的点击之后更换背景色,并且保持这个颜色,表示已读取该条信息。这个功能一开始觉得已经实现了,在我的另一篇博客上有:点击打开链接 后来测试人员在测试的时候,发现这样一个奇怪的问题:

当点击了listview的第0项,背景颜色改变,并且保持着背景没错,但滑动到下一个页面的listview,原本没有点击的item,竟然莫名其妙的出现了更换的背景。。。

出现上述的情况是因为我实现的原理是这样的:当用户点击某一个item,会进入到监听方法里面,我设置一个变量保存所选中的位置position,也就是如下代码:

  arg1.setSelected(true);selectItem = arg2; // 当前选择的节目itemmessageAd.notifyDataSetChanged(); // 通知adapter刷新数据

在适配器里面,我就使用if语句判断,如果position等于刚才所点击的item,则设置背景颜色,如下代码:

if (selectItem == position) {//设置背景// }

上述设置就会出现错乱的问题,原因以后再深究,下面贴出解决的办法,不多说直接上代码,有注释:

package com.explink.listview;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;public class MainActivity extends Activity {private ListView mListView;private MyAdapter mAdapter;List<User> userList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initView() {mListView = (ListView) findViewById(R.id.mListView);}private void initData() {User user = new User("卢磊", "13319405061");User user1 = new User("小明", "13319405062");User user2 = new User("小黄", "13319405063");User user3 = new User("小绿", "13319405064");User user4 = new User("卢磊", "13319405061");User user5 = new User("小明", "13319405062");User user6 = new User("小黄", "13319405063");User user7 = new User("小绿", "13319405064");User user8 = new User("卢磊", "13319405061");User user9 = new User("小明", "13319405062");User user10 = new User("小黄", "13319405063");User user11 = new User("小绿", "13319405064");User user12 = new User("卢磊", "13319405061");User user13 = new User("小明", "13319405062");User user14 = new User("小黄", "13319405063");User user15 = new User("小绿", "13319405064");User user16 = new User("卢磊", "13319405061");User user17 = new User("小明", "13319405062");User user18 = new User("小黄", "13319405063");User user19 = new User("小绿", "13319405064");User user20 = new User("卢磊", "13319405061");User user21 = new User("小明", "13319405062");User user22 = new User("小黄", "13319405063");User user23 = new User("小绿", "13319405064");// 一般从网络上获取的数据都是List集合userList = new ArrayList<User>();userList.add(user);userList.add(user1);userList.add(user2);userList.add(user3);userList.add(user4);userList.add(user5);userList.add(user6);userList.add(user7);userList.add(user8);userList.add(user9);userList.add(user10);userList.add(user11);userList.add(user12);userList.add(user13);userList.add(user14);userList.add(user15);userList.add(user16);userList.add(user17);userList.add(user18);userList.add(user19);userList.add(user20);userList.add(user21);userList.add(user22);userList.add(user23);mAdapter = new MyAdapter(MainActivity.this, userList);mListView.setAdapter(mAdapter);mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {mAdapter.recordPosition(arg2);mAdapter.notifyDataSetChanged();}});}@SuppressLint("UseSparseArrays")public class MyAdapter extends BaseAdapter {private LayoutInflater inflater;private List<User> userList;private List<Integer> pList = new ArrayList<Integer>();public MyAdapter(Context context, List<User> userList) {this.inflater = LayoutInflater.from(context);this.userList = userList;}@Overridepublic int getCount() {return this.userList.size();}@Overridepublic Object getItem(int position) {return userList.get(position);}@Overridepublic long getItemId(int position) {return position;}public void recordPosition(int position) {pList.add(position);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, null);holder = new ViewHolder();holder.name_tv = (TextView) convertView.findViewById(R.id.name_tv);holder.phone_tv = (TextView) convertView.findViewById(R.id.phone_tv);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.name_tv.setText(userList.get(position).getName());holder.phone_tv.setText(userList.get(position).getPhoneNo());//防止convertView复用背景,导致第二页出现灰色背景,所以在判断设定为白色convertView.setBackgroundColor(Color.WHITE);for (int i = 0; i < pList.size(); i++) {if (pList.get(i) == position) {convertView.setBackgroundColor(Color.GRAY);}}return convertView;}public class ViewHolder {public TextView name_tv;public TextView phone_tv;}}
}

数据源的类为:

package com.explink.listview;public class User {public User(){}public User(String name,String phoneNo){this.name = name;this.phoneNo = phoneNo;}private String name;private String phoneNo;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhoneNo() {return phoneNo;}public void setPhoneNo(String phoneNo) {this.phoneNo = phoneNo;}}

资源已经上传到csdn,传送门在此: android listview已读功能  ,上一篇的博客如果有需要查看的,可以参考如下链接: android listview保持背景颜色

Android ListView点击之后保持更换的背景色,实现已读功能相关推荐

  1. Android Listview 点击item变黄色

    1. 问题 listview 点击或一直按着item 变黄色 如下图所示. 2. 解决办法 XML中 设置listview属性 android:listSelector="#00000000 ...

  2. android listview 点击获取焦点,android – ListView项目焦点行为

    我正在尝试创建一个EditText项目的ListView(使用自定义CursorAdapter),这样EditTexts最初看起来是不可编辑的,并且在长时间单击后变得可编辑.然后,用户将编辑EditT ...

  3. android开发点击展开列表,android - listView点击展开收起实现

    废话不多说, 上图: GIF.gif 上思路: 动态改变数据适配器中的getCount()方法的返回值; 点击刷新适配器中的数据; 注意: 1.这是在普通的布局中实现; 2.如需要在ScrollVie ...

  4. Android ListView点击事件无反应

    ListView焦点相关 今天写了一个listview 适配之后设置了点击事件百思不得其解后来看到有篇文章说,可能是xml文件的style不对,不能是 <itemname="Andro ...

  5. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)

    一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector  用户指定当前选中item 的颜色 ...

  6. android listview 点击 过滤,Android: ListView排序及过滤

    1) 排序 ListView通过适配器得到内容数据,可以对数据list先排序再提供给ListView: private List> getData() { List> list = new ...

  7. android listview设置选中时的item的背景色

    今天实在不知道写些什么内容,所以自己在网上找了些资料,觉得还可以,所以还是写一下,觉得每天写些东西的习惯不能荒废. 默认情况下使用ListView背景色是黑色,选中item的高亮颜色是菊黄色,很多时候 ...

  8. Android ListView示例教程

    We will learn how to create a simple Android ListView and launch a new activity on selecting a singl ...

  9. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

最新文章

  1. component映射
  2. BT5下用ncrack破解3389
  3. poj 3177 Redundant Paths
  4. django 迁移工程数据库无法创建的问题
  5. kafka的四种checkpoint(没有整理完)
  6. datagridview 当前上下文中不存在bind_全面解析JavaScript中this指向问题
  7. 经典重温:CVPR 2010 What is an object?
  8. 1438.最小公倍数
  9. TypeSDK免费手游多渠道SDK接入方案
  10. vgcreate 创建卷组
  11. Android release apk 签名流程
  12. 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...
  13. 人工智能研究生新动向!教育部明确五大培养方向!
  14. 荣耀V20设置国科大邮箱步骤
  15. mysql带条件的插入语句
  16. 微信小程序 image图片组件实现宽度固定 高度自适应
  17. Oracle数据库断电致使控制文件不一致的恢复方法
  18. CANopen移植步骤和ESD编辑器安装方式
  19. Elastic实战:canal自定义客户端,实现mysql多表同步到es
  20. 根据文件头检测文件类型的完整代码

热门文章

  1. 2022-2028全球工业用视频内窥镜行业调研及趋势分析报告
  2. 第7章第31节:四图排版:四张图片两两一组并行排列 [PowerPoint精美幻灯片实战教程]
  3. 微信小程序父子组件相互通信
  4. CODEVS 1258 关路灯
  5. 移动硬盘 无法读取 插入电脑没反应 无法识别 怎么办
  6. 每周一品 · 音圈电机(VCM)中的磁性材料
  7. 解析华为OSPF协议
  8. Photoshop使用技巧
  9. 1.SD卡初始化、写入、读取、数据比较
  10. 添加打印机时提示:未安装打印机驱动,试图将打印机添加到存储区时遇到问题