listview 选中高亮显示实现方法
程序员文章站
2023-12-05 17:41:16
人人客户端有一个很好的导航栏,如下图所示,当点击左侧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;
}
}
}
刚开始实现的时候,我打算使用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;
}
}
}