listView 如何保持选中项高亮

laorer 2010-05-19 02:52:51


在listview通过 ArrayAdapter 加入了一组数据, 并监听 OnItemClickListener 事件

但点击 listView的某一个Item时,已经触发了 OnItemClickListener事件,但是在item被选中时,被选中的 item周围会显示橙黄色,但有时橙黄色很快就消失了,有时还会存在,请问有什么办法解决?

另外,触发 OnItemClickListener 事件后,我会重新加载数据到另一个 listView listB中,这时,原来的listView listA会失去焦点,就是在 listA 的 OnItemClickListener事件中 最后部分重新请求聚焦 listA.requestFocus() 也没有用,请问有什么办法解决


总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮

谢谢
...全文
8464 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
slate2008 2011-12-12
  • 打赏
  • 举报
回复
11楼正解:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int arg2,
long arg3) {
index = arg2;
if (((ListView) parent).getTag() != null) {
((View) ((ListView) parent).getTag())
.setBackgroundDrawable(null);
}
((ListView) parent).setTag(view);
view.setBackgroundColor(0xffffff00);
}
});
xchchx 2011-12-06
  • 打赏
  • 举报
回复
11楼好使
nevercool 2011-12-06
  • 打赏
  • 举报
回复
谢谢!
[Quote=引用 14 楼 strong46066999 的回复:]

哥们,给你个靠谱的答案吧,参考。http://blog.csdn.net/zhiyou007/article/details/6438493
[/Quote]
strong46066999 2011-11-14
  • 打赏
  • 举报
回复
哥们,给你个靠谱的答案吧,参考。http://blog.csdn.net/zhiyou007/article/details/6438493


qoofan 2011-11-04
  • 打赏
  • 举报
回复
在public void setSelectItem(int index){
mItemIndex = index;
notifyDataSetChanged();
}

if (position == mSelectedPosition) {
convertView.setBackgroundColor(0x110000ff);
}
else {
convertView.setBackgroundColor(0x00ffffff);
}
Gino_Zhang 2011-09-29
  • 打赏
  • 举报
回复
不错,
OnItemClickListener listviewMemuOnItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

if (((ListView)parent).getTag() != null){

((View)((ListView)parent).getTag()).setBackgroundDrawable(null);

}

((ListView)parent).setTag(view);

view.setBackgroundResource(R.drawable.listitem_bk);

}

};
这个好使
痴心笨笨 2011-05-18
  • 打赏
  • 举报
回复
网上的方法,感觉更好使:
ListView 保持选中状态 高亮
在有些应用场景下. 需要保持ListVIew 的选中状态.有种实现方式就是,定义一个私有变量.用以记录前一次选中的Item,然后再次点击时,将上次View的background清空.代码大概如下:
View oldView;

OnItemClickListener listviewMemuOnItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

if (oldView != null){

oldView.setBackgroundDrawable(null);

}

oldView = view;

view.setBackgroundResource(R.drawable.listitem_bk);

}

};

不过稍加改造,就可以省去oldView这个变量.即借助Listview的Tag属性.
OnItemClickListener listviewMemuOnItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

if (((ListView)parent).getTag() != null){

((View)((ListView)parent).getTag()).setBackgroundDrawable(null);

}

((ListView)parent).setTag(view);

view.setBackgroundResource(R.drawable.listitem_bk);

}

};


对于这个Tag属性,通常不会用到,至少我很少用到,在开发过程中,偶尔借助Tag保存某些内容,那是相当方便,是居家旅行之必备.

除了上述的保持项目选中高亮的方法.谁还有更好的办法.烦劳告知啊.呵呵

laorer 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liuxiue2010 的回复:]
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
[/Quote]

你要记录本次选中的 view,以便下次判断 选中的view是不是本次的选中的 view,如果不是,你就可以按照一般的方式来设置 view了
convertView=getLayoutInflater().inflate(R.layout.itemLayout,parent, false);
liuxiue2010 2010-11-15
  • 打赏
  • 举报
回复
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
Anbrul 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 laorer 的回复:]
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
[/Quote]
在getView的时候如果不是你选中的item就把背景还原回去。
yyy025025025 2010-05-20
  • 打赏
  • 举报
回复
在adpater里面定义一个变量记录被选中的item,并提供设置接口
private int mItemIndex = -1;

public void setSelectItem(int index){
mItemIndex = index;
}

在onItemClick中,
public void onItemClick(AdapterView<?> parent, View view, int position,
long id){
mAdapter.setSelectItem(position);
view.setBackgroundColor(Color.BLUE);
}

在getView中,
public View getView(int position,View convertView, ViewGroup parent){
....
if(position == mItemIndex){
view.setSelected(true);
view.setPressed(true);
view.setBackgroundColor(Color.BLUE);
}
....
}
laorer 2010-05-20
  • 打赏
  • 举报
回复
OK, 可以了,昨天可能某个地方弄错了

谢谢了
laorer 2010-05-20
  • 打赏
  • 举报
回复
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
laorer 2010-05-19
  • 打赏
  • 举报
回复
我在onItemClick事件中, view.setSelected(true); 会使得它与其他的 item不一样,但我还是不知道如何使 这个 item的颜色变成其它的颜色, 用 view.SetBackgroud吗?  我试过了,好像没效果
yyy025025025 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 laorer 的回复:]

谢谢回复,能不能具体说说
修改frameworks\base\core\res\res\drawable\list_selector_background.xml
里面的设置
我只找到了

<item android:state_focused="true" android:drawable="@color/state_focused"></item>
<item andr……
[/Quote]

对的 这边会修改整个listview的属性。

我自己处理的listview的Onitemclick,会使用同样的selector,只不过我会自己设定item的状态。
通过 view.setSelected(selected);
view.setPressed(pressed)
来实现的状态转换。

所以推荐你使用第二种方法。
laorer 2010-05-19
  • 打赏
  • 举报
回复
谢谢回复,能不能具体说说
修改frameworks\base\core\res\res\drawable\list_selector_background.xml
里面的设置
我只找到了

<item android:state_focused="true" android:drawable="@color/state_focused"></item>
<item android:state_pressed="true" android:drawable="@color/state_pressed"></item>
但设置的是整个 listView的
yyy025025025 2010-05-19
  • 打赏
  • 举报
回复
方法有兩個:
1. 修改frameworks\base\core\res\res\drawable\list_selector_background.xml

2. 在adpater中定義一個變量記錄需要高亮的item,在getView中自己來實現高亮效果。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧