欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

listview 选中高亮显示实现方法

程序员文章站 2023-12-15 11:49:04
人人客户端有一个很好的导航栏,如下图所示,当点击左侧listview后,选中的一行就会一直呈高亮状态显示,图中选中行字的颜色显示为蓝色(注意:是选中行后一直高亮,而不是只是...
人人客户端有一个很好的导航栏,如下图所示,当点击左侧listview后,选中的一行就会一直呈高亮状态显示,图中选中行字的颜色显示为蓝色(注意:是选中行后一直高亮,而不是只是点击时高亮),如果再次点击另外的一行, 则新的那一行就高亮,下面就来实现这个高亮效果的显示;
listview 选中高亮显示实现方法 
刚开始实现的时候,我打算使用listview的 getchildat(int
pos)方法来实现,结果发现非常的cao蛋,因为listview本身的原因,当你view
view=listview.getchildat(pos),并且改变这个view的状态时,你会发现,高亮的往往不是你
选中的那行,反而是其他行,这是由于listview本身决定了,google在设计listview的时候,为了减少内存的消耗,使 用了一种共用的方式,即多个行共用一个view,所以才会出现点击后乱跳的现象(这是一种很高明的方法,不过也苦了程序猿们);
于是就选择了另外一种方式,listview都有一个adapter来显示数据,而这个adapter中的getview()却能获得准确的每一行,这里我们需要自定义一个继承自baseadapter的adapter来实现(如果使用arrayadapter等自带的adapter时,不会实现这样的功能);另外,这个listview一定要设置一个属性:listview.setchoicemode(listview.choice_mode_single);
即设置为单选模式,这样当你点击一行后,listview就会刷新界面,还有就是给listview设置onitemclicklistener监听器, 当点击一行后,就更新当前行的下标,所有代码如下所示:
复制代码 代码如下:

public class listviewdemo extends activity {
private listview listview;
private int cur_pos = 0;// 当前显示的一行
private string[] items_text = { "选项一", "选项二", "选项三", "选项四", "选项五" };
private int[] items_img = { r.drawable.ic_launcher, r.drawable.ic_launcher,
r.drawable.ic_launcher, r.drawable.ic_launcher,
r.drawable.ic_launcher };
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_list_view_demo);
listview = (listview) findviewbyid(r.id.listview);
final myadapter adapter = new myadapter(this);
listview.setadapter(adapter);
listview.setchoicemode(listview.choice_mode_single);// 一定要设置这个属性,否则listview不会刷新
listview.setonitemclicklistener(new onitemclicklistener() {
@override
public void onitemclick(adapterview<?> arg0, view arg1,
int position, long id) {
cur_pos = position;// 更新当前行
}
});
}
private class myadapter extends baseadapter {
private layoutinflater inflater;
public myadapter(context context) {
inflater = (layoutinflater) context
.getsystemservice(context.layout_inflater_service);
}
@override
public int getcount() {
return items_text.length;
}
@override
public object getitem(int position) {
return items_text[position];
}
@override
public long getitemid(int position) {
return position;
}
@override
public view getview(int position, view convertview, viewgroup parent) {
log.e("test", "refresh once");
convertview = inflater.inflate(r.layout.list_child, null, false);
imageview img = (imageview) convertview
.findviewbyid(r.id.list_child_img);// 用于显示图片
textview tv = (textview) convertview
.findviewbyid(r.id.list_child_text);// 显示文字
tv.settext(items_text[position]);
img.setimageresource(items_img[position]);
if (position == cur_pos) {// 如果当前的行就是listview中选中的一行,就更改显示样式
convertview.setbackgroundcolor(color.ltgray);// 更改整行的背景色
tv.settextcolor(color.red);// 更改字体颜色
}
return convertview;
}
}
}
public class listviewdemo extends activity {
private listview listview;
private int cur_pos = 0;// 当前显示的一行
private string[] items_text = { "选项一", "选项二", "选项三", "选项四", "选项五" };
private int[] items_img = { r.drawable.ic_launcher, r.drawable.ic_launcher,
r.drawable.ic_launcher, r.drawable.ic_launcher,
r.drawable.ic_launcher };
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_list_view_demo);
listview = (listview) findviewbyid(r.id.listview);
final myadapter adapter = new myadapter(this);
listview.setadapter(adapter);
listview.setchoicemode(listview.choice_mode_single);// 一定要设置这个属性,否则listview不会刷新
listview.setonitemclicklistener(new onitemclicklistener() {
@override
public void onitemclick(adapterview<?> arg0, view arg1,
int position, long id) {
cur_pos = position;// 更新当前行
}
});
}
private class myadapter extends baseadapter {
private layoutinflater inflater;
public myadapter(context context) {
inflater = (layoutinflater) context
.getsystemservice(context.layout_inflater_service);
}
@override
public int getcount() {
return items_text.length;
}
@override
public object getitem(int position) {
return items_text[position];
}
@override
public long getitemid(int position) {
return position;
}
@override
public view getview(int position, view convertview, viewgroup parent) {
log.e("test", "refresh once");
convertview = inflater.inflate(r.layout.list_child, null, false);
imageview img = (imageview) convertview
.findviewbyid(r.id.list_child_img);// 用于显示图片
textview tv = (textview) convertview
.findviewbyid(r.id.list_child_text);// 显示文字
tv.settext(items_text[position]);
img.setimageresource(items_img[position]);
if (position == cur_pos) {// 如果当前的行就是listview中选中的一行,就更改显示样式
convertview.setbackgroundcolor(color.ltgray);// 更改整行的背景色
tv.settextcolor(color.red);// 更改字体颜色
}
return convertview;
}
}
}

上一篇:

下一篇: