Android中的ListView是用得非常频繁的一种组件,同时ListView也是一种很强大的组件,你可以为每一行自定义布局,也可以修改各行的
背景色。自定义布局比较容易,自己实现一个layout的布局文件,然后在adapter的getView里读入就可以了。需要注意的是,在
getView中不需要每次都加载layout文件,因为ListView会重复利用已生成的Item。所以每次拖动上下滚动条的时候其实每行的Item
变化的只是显示的内容,就窗体本身而言是不变的,Android SDK里自带的例子是最好的说明。
/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unneccessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the convertView supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
static class ViewHolder {
TextView text;
ImageView icon;
}
}
Android的界面开发模式决定了实现某一种风格的组件存在很多种方法,而如果没有对它的界面框架有个比较全面的理解的话往往实现起来要走很多弯路,譬如给各item设置背景色。因为在邮件列表中要显示两种颜色,已经阅读过的和未读的邮件以不同的背景色标识。
在item的layout文件里只能设置一中固定的颜色,这当然不是我想要的。
最直接的思路就是在Adapter的getView中根据position的不同来设置不同的背景色,但是设置了不同颜色后发现在屏幕上选中一行时背景色没有变化,选中跟没选中的颜色是一样的。于是又重新设置selector,但仍然不起作用。
看来getView中返回的View就是ListView中各行最终显示界面,所以又想着先在ListView的
OnItemClickListener中记录当前选中的Item,然后在getView中判断是不是该行,如果是,就设置为选中的背景色。但是这种方法
存在很大的问题,第一个问题就是onItemClickListener是在用户点击之后调用的,所以背景色的改变也是用户点完了之后才发生,而正确的应
该是press的一瞬间改变背景色。第二个问题是,再返回到该ListView时需要在代码里重新清楚选中行的记录,否则该行的背景色不会刷新。
最终的解决方法是这样的:
实现两个selector文件(正常显示下有几种背景色就需要几个这样的selector文件)
mail_read_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android
">
<item
android:state_selected="false"
android:state_pressed="false"
android:drawable="@color/ltgray" />
<item android:state_pressed="true"
android:drawable="@color/red" />
<item android:state_selected="true"
android:state_pressed="false"
android:drawable="@color/red" />
</selector>
mail_unread_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android
">
<item
android:state_selected="false"
android:state_pressed="false"
android:drawable="@color/white" />
<item android:state_pressed="true"
android:drawable="@color/red" />
<item android:state_selected="true"
android:state_pressed="false"
android:drawable="@color/red" />
</selector>
在getView中根据邮件不同的状态设置不同的颜色方案
if unread
convertView.setBackgroundResource(R.drawable.mail_unread_bg);
else
convertView.setBackgroundResource(R.drawable.mail_read_bg);
分享到:
相关推荐
listview高效显示网络图片,借助的第三方jar包,可以查看源码! 不卡顿,界面漂亮
Android ListView错位问题之背景色错位
android 布局中网格视图 ListView的简单运用 采用的是最简单的ArrayAdapter适配器
Android自定义adapter的listview代码
主要介绍了WPF的ListView控件自定义布局的方法,结合实例形式分析了WPF中ListView控件的布局方法,需要的朋友可以参考下
我们常见的androidlistview 都是整体改变背景颜色,我今天上传的是 动态改变listview 其中一条或者多条的背景颜色,以及改变item的颜色。 不需要添加list的点击事件 就可以完成。
android listview 列表点击时改变点击颜色效果,本人抽空开发,亲测,有需要的可以下载
android listview 自定义样式实例 可以改造成自己所需风格
自定义android中ListView 实现自定义的ListView并且可以点击button响应事件
android中listview中的item内容不一样时,我们就可以通过自定义adapter来判断和控制不同的item显示内容
Android 自定义ListView,分别实现下拉刷新的ListView及上拉加载的ListView 详情可以参考我的博客 http://blog.csdn.net/sunshanai/article/details/51622917
Android ListView每个Item上面的有TextView和Button,为ListView每个Item上面的按钮添加事件,并获取TextView文本信息。
android 自定义listview分组显示本地json格式数据,主要是listview可以自定义成下拉刷新(此demo不包含上下拉,应用者自己完善),组头和组所属的数据的item点击事件是分开的
实现自定义的listView,学习图文混排技术,有助于理清思路
ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了,要实现放开鼠标后选择项的背景还是有颜色的。
android 使用Scroller实现绚丽的ListView左右滑动删除Item效果 RemoveListener
谷歌的sdk中item的背景颜色默认是黄色的,通过自定义我们可以改变item的背景颜色
采用ListView控件加自定义适配器实现listview列表控件,代码简单,逻辑清楚,可扩展性强,并且解决了OOM,亲测绝对可以使用
需求如题目:Android listview中item部分区域添加点击事件,在一个界面显示了listview,但显示的内容分为上下两部分,分别是白色的背景和蓝色的背景,现在需要只点击蓝色的背景,才能跳转到其他界面,解决方式如下:...
android自定义listview使用方法 提供一般listview 带图片的listview 带按钮的listview listview学习的好Demo