Android ListView点击之后保持更换的背景色,实现已读功能
因为项目中有这样的需求:一般消息类或者资讯类的界面,都有类似于网易客户端的点击之后更换背景色,并且保持这个颜色,表示已读取该条信息。这个功能一开始觉得已经实现了,在我的另一篇博客上有:点击打开链接 后来测试人员在测试的时候,发现这样一个奇怪的问题:
当点击了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点击之后保持更换的背景色,实现已读功能相关推荐
- Android Listview 点击item变黄色
1. 问题 listview 点击或一直按着item 变黄色 如下图所示. 2. 解决办法 XML中 设置listview属性 android:listSelector="#00000000 ...
- android listview 点击获取焦点,android – ListView项目焦点行为
我正在尝试创建一个EditText项目的ListView(使用自定义CursorAdapter),这样EditTexts最初看起来是不可编辑的,并且在长时间单击后变得可编辑.然后,用户将编辑EditT ...
- android开发点击展开列表,android - listView点击展开收起实现
废话不多说, 上图: GIF.gif 上思路: 动态改变数据适配器中的getCount()方法的返回值; 点击刷新适配器中的数据; 注意: 1.这是在普通的布局中实现; 2.如需要在ScrollVie ...
- Android ListView点击事件无反应
ListView焦点相关 今天写了一个listview 适配之后设置了点击事件百思不得其解后来看到有篇文章说,可能是xml文件的style不对,不能是 <itemname="Andro ...
- Android ListView 点击item改变item的背景颜色(ListView实现光标移动)
一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector 用户指定当前选中item 的颜色 ...
- android listview 点击 过滤,Android: ListView排序及过滤
1) 排序 ListView通过适配器得到内容数据,可以对数据list先排序再提供给ListView: private List> getData() { List> list = new ...
- android listview设置选中时的item的背景色
今天实在不知道写些什么内容,所以自己在网上找了些资料,觉得还可以,所以还是写一下,觉得每天写些东西的习惯不能荒废. 默认情况下使用ListView背景色是黑色,选中item的高亮颜色是菊黄色,很多时候 ...
- Android ListView示例教程
We will learn how to create a simple Android ListView and launch a new activity on selecting a singl ...
- android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...
1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为 2,为了使LISTVIEW的ITEM在点 ...
最新文章
- component映射
- BT5下用ncrack破解3389
- poj 3177 Redundant Paths
- django 迁移工程数据库无法创建的问题
- kafka的四种checkpoint(没有整理完)
- datagridview 当前上下文中不存在bind_全面解析JavaScript中this指向问题
- 经典重温:CVPR 2010 What is an object?
- 1438.最小公倍数
- TypeSDK免费手游多渠道SDK接入方案
- vgcreate 创建卷组
- Android release apk 签名流程
- 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...
- 人工智能研究生新动向!教育部明确五大培养方向!
- 荣耀V20设置国科大邮箱步骤
- mysql带条件的插入语句
- 微信小程序 image图片组件实现宽度固定 高度自适应
- Oracle数据库断电致使控制文件不一致的恢复方法
- CANopen移植步骤和ESD编辑器安装方式
- Elastic实战:canal自定义客户端,实现mysql多表同步到es
- 根据文件头检测文件类型的完整代码