再调用listView.setSelection(selectIndex);前加一句
listView.requestFocusFromTouch();
===================================================
Android的ListView的点击高亮(续)
2010-07-25 17:30:07 作者:哈哈 正式编辑 有1048人浏览 网友评论 2 条
在上一篇Android的ListView的点击高亮文章中其实没有达到我想要我的效果,如果是不需要横竖屏的情况还是可以的,在这里我要强调大家别去用系统的adapter的getView和listView的getChildAt要改变View的背景。我在这方面下了很多功夫,都没实现,而且会出现大家预想不到的效果,下面我来介绍实现这个的终极办法,就是你在重写BaseAdapter或者其他adapter来实现,演示的主要代码如下:
view sourceprint?001.
public void onCreate(Bundle savedInstanceState) {
002.
super.onCreate(savedInstanceState);
003.
final MyListAdapter adapter=new MyListAdapter(this);
004.
setListAdapter(adapter);
005.// getListView().setSelector(R.drawable.selector);
006.
getListView().setOnItemClickListener(new OnItemClickListener(){
007.
008.
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
009.
adapter.setSelectItem(arg2);
010.
adapter.notifyDataSetInvalidated();
011.
}
012.
013.
});
014.
}
015.
016.
private class MyListAdapter extends BaseAdapter {
017.
public MyListAdapter(Context context) {
018.
mContext = context;
019.
}
020.
021.
public int getCount() {
022.
return mStrings.length;
023.
}
024.
025.
public boolean areAllItemsEnabled() {
026.
return false;
027.
}
028.
029.
public boolean isEnabled(int position) {
030.
return !mStrings[position].startsWith("-");
031.
}
032.
033.
public Object getItem(int position) {
034.
return position;
035.
}
036.
037.
public long getItemId(int position) {
038.
return position;
039.
}
040.
041.
public View getView(int position, View convertView, ViewGroup parent) {
042.
TextView tv;
043.
if (convertView == null) {
044.
tv = (TextView) LayoutInflater.from(mContext).inflate(
045.
android.R.layout.simple_expandable_list_item_1, parent, false);
046.
} else {
047.
tv = (TextView) convertView;
048.
}
049.
tv.setText(mStrings[position]);
050.
if(position==selectItem){
051.
tv.setBackgroundColor(Color.RED);
052.
}else{
053.
tv.setBackgroundColor(Color.TRANSPARENT);
054.
}
055.
return tv;
056.
}
057.
058.
059.
060.
public void setSelectItem(int selectItem) {
061.
this.selectItem = selectItem;
062.
}
063.
064.
private Context mContext;
065.
private int selectItem=-1;
066.
}
067.
068.
private String[] mStrings = {
069.
"----------",
070.
"----------",
071.
"Abbaye de Belloc",
072.
"Abbaye du Mont des Cats",
073.
"Abertam",
074.
"----------",
075.
"Abondance",
076.
"----------",
077.
"Ackawi",
078.
"Acorn",
079.
"Adelost",
080.
"Affidelice au Chablis",
081.
"Afuega'l Pitu",
082.
"Airag",
083.
"----------",
084.
"Airedale",
085.
"Aisy Cendre",
086.
"----------",
087.
"Allgauer Emmentaler",
088.
"Alverca",
089.
"Ambert",
090.
"American Cheese",
091.
"Ami du Chambertin",
092.
"----------",
093.
"----------",
094.
"Anejo Enchilado",
095.
"Anneau du Vic-Bilh",
096.
"Anthoriro",
097.
"----------",
098.
"----------"
099.
};
主要改动的代码就是:view sourceprint?1.public void setSelectItem(int selectItem) {
2.
this.selectItem = selectItem;
3.
}
4.
private int selectItem=-1;
当用户点击Item的时候,把当前的位置给adapter,并且通过adapter.notifyDataSetInvalidated();刷新整个ListView,就达到改背景的效果。
===========================================================================
在listview通过 ArrayAdapter 加入了一组数据, 并监听 OnItemClickListener 事件
但点击 listView的某一个Item时,已经触发了 OnItemClickListener事件,但是在item被选中时,被选中的 item周围会显示橙黄色,但有时橙黄色很快就消失了,有时还会存在,请问有什么办法解决?
另外,触发 OnItemClickListener 事件后,我会重新加载数据到另一个 listView listB中,这时,原来的listView listA会失去焦点,就是在 listA 的 OnItemClickListener事件中 最后部分重新请求聚焦 listA.requestFocus() 也没有用,请问有什么办法解决
总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮
谢谢
对我有用[0]丢个板砖[0]引用举报管理TOP 回复次数:10
yyy025025025
(yyy025025025)
等 级:
#1楼 得分:50回复于:2010-05-19 16:12:05
如需要阅读该回复,请登录或注册CSDN!
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:急求用过funambol的同仁,请教一些问题。
laorer
(堕落佛)
等 级:
#2楼 得分:0回复于:2010-05-19 16:28:20
谢谢回复,能不能具体说说
修改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的
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:想成为嵌入式程序员应知道的0x10个基本问题——转贴 经典!
yyy025025025
(yyy025025025)
等 级:
#3楼 得分:0回复于:2010-05-19 17:49:06
引用 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……
对的 这边会修改整个listview的属性。
我自己处理的listview的Onitemclick,会使用同样的selector,只不过我会自己设定item的状态。
通过 view.setSelected(selected);
view.setPressed(pressed)
来实现的状态转换。
所以推荐你使用第二种方法。
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:如何在程序中创建快捷方式的图标
laorer
(堕落佛)
等 级:
#4楼 得分:0回复于:2010-05-19 20:11:17
我在onItemClick事件中, view.setSelected(true); 会使得它与其他的 item不一样,但我还是不知道如何使 这个 item的颜色变成其它的颜色, 用 view.SetBackgroud吗? 我试过了,好像没效果
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:呕血整理个个精华,推荐观看!
yyy025025025
(yyy025025025)
等 级:
#5楼 得分:0回复于:2010-05-20 00:11:54
在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);
}
....
}
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:讨论:3G时代的到来,对手机软件开发影响会有多大呢?应用会有那些变化呢?
laorer
(堕落佛)
等 级:
#6楼 得分:0回复于:2010-05-20 09:40:21
OK, 可以了,昨天可能某个地方弄错了
谢谢了
对我有用[0]丢个板砖[0]引用举报管理TOP
laorer
(堕落佛)
等 级:
#7楼 得分:0回复于:2010-05-20 14:28:43
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
对我有用[0]丢个板砖[0]引用举报管理TOP
anbrul
(anbrul)
等 级:
#8楼 得分:0回复于:2010-07-14 17:01:07
引用 7 楼 laorer 的回复:
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
在getView的时候如果不是你选中的item就把背景还原回去。
对我有用[0]丢个板砖[0]引用举报管理TOP
liuxiue2010
(liuxiue2010)
等 级:
#9楼 得分:0回复于:2010-11-15 14:49:58
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
对我有用[0]丢个板砖[0]引用举报管理TOP
laorer
(堕落佛)
等 级:
#10楼 得分:0回复于:2010-11-15 17:27:09
引用 9 楼 liuxiue2010 的回复:
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
你要记录本次选中的 view,以便下次判断 选中的view是不是本次的选中的 view,如果不是,你就可以按照一般的方式来设置 view了
convertView=getLayoutInflater().inflate(R.layout.itemLayout,parent, false);
listView.requestFocusFromTouch();
===================================================
Android的ListView的点击高亮(续)
2010-07-25 17:30:07 作者:哈哈 正式编辑 有1048人浏览 网友评论 2 条
在上一篇Android的ListView的点击高亮文章中其实没有达到我想要我的效果,如果是不需要横竖屏的情况还是可以的,在这里我要强调大家别去用系统的adapter的getView和listView的getChildAt要改变View的背景。我在这方面下了很多功夫,都没实现,而且会出现大家预想不到的效果,下面我来介绍实现这个的终极办法,就是你在重写BaseAdapter或者其他adapter来实现,演示的主要代码如下:
view sourceprint?001.
public void onCreate(Bundle savedInstanceState) {
002.
super.onCreate(savedInstanceState);
003.
final MyListAdapter adapter=new MyListAdapter(this);
004.
setListAdapter(adapter);
005.// getListView().setSelector(R.drawable.selector);
006.
getListView().setOnItemClickListener(new OnItemClickListener(){
007.
008.
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
009.
adapter.setSelectItem(arg2);
010.
adapter.notifyDataSetInvalidated();
011.
}
012.
013.
});
014.
}
015.
016.
private class MyListAdapter extends BaseAdapter {
017.
public MyListAdapter(Context context) {
018.
mContext = context;
019.
}
020.
021.
public int getCount() {
022.
return mStrings.length;
023.
}
024.
025.
public boolean areAllItemsEnabled() {
026.
return false;
027.
}
028.
029.
public boolean isEnabled(int position) {
030.
return !mStrings[position].startsWith("-");
031.
}
032.
033.
public Object getItem(int position) {
034.
return position;
035.
}
036.
037.
public long getItemId(int position) {
038.
return position;
039.
}
040.
041.
public View getView(int position, View convertView, ViewGroup parent) {
042.
TextView tv;
043.
if (convertView == null) {
044.
tv = (TextView) LayoutInflater.from(mContext).inflate(
045.
android.R.layout.simple_expandable_list_item_1, parent, false);
046.
} else {
047.
tv = (TextView) convertView;
048.
}
049.
tv.setText(mStrings[position]);
050.
if(position==selectItem){
051.
tv.setBackgroundColor(Color.RED);
052.
}else{
053.
tv.setBackgroundColor(Color.TRANSPARENT);
054.
}
055.
return tv;
056.
}
057.
058.
059.
060.
public void setSelectItem(int selectItem) {
061.
this.selectItem = selectItem;
062.
}
063.
064.
private Context mContext;
065.
private int selectItem=-1;
066.
}
067.
068.
private String[] mStrings = {
069.
"----------",
070.
"----------",
071.
"Abbaye de Belloc",
072.
"Abbaye du Mont des Cats",
073.
"Abertam",
074.
"----------",
075.
"Abondance",
076.
"----------",
077.
"Ackawi",
078.
"Acorn",
079.
"Adelost",
080.
"Affidelice au Chablis",
081.
"Afuega'l Pitu",
082.
"Airag",
083.
"----------",
084.
"Airedale",
085.
"Aisy Cendre",
086.
"----------",
087.
"Allgauer Emmentaler",
088.
"Alverca",
089.
"Ambert",
090.
"American Cheese",
091.
"Ami du Chambertin",
092.
"----------",
093.
"----------",
094.
"Anejo Enchilado",
095.
"Anneau du Vic-Bilh",
096.
"Anthoriro",
097.
"----------",
098.
"----------"
099.
};
主要改动的代码就是:view sourceprint?1.public void setSelectItem(int selectItem) {
2.
this.selectItem = selectItem;
3.
}
4.
private int selectItem=-1;
当用户点击Item的时候,把当前的位置给adapter,并且通过adapter.notifyDataSetInvalidated();刷新整个ListView,就达到改背景的效果。
===========================================================================
在listview通过 ArrayAdapter 加入了一组数据, 并监听 OnItemClickListener 事件
但点击 listView的某一个Item时,已经触发了 OnItemClickListener事件,但是在item被选中时,被选中的 item周围会显示橙黄色,但有时橙黄色很快就消失了,有时还会存在,请问有什么办法解决?
另外,触发 OnItemClickListener 事件后,我会重新加载数据到另一个 listView listB中,这时,原来的listView listA会失去焦点,就是在 listA 的 OnItemClickListener事件中 最后部分重新请求聚焦 listA.requestFocus() 也没有用,请问有什么办法解决
总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮
谢谢
对我有用[0]丢个板砖[0]引用举报管理TOP 回复次数:10
yyy025025025
(yyy025025025)
等 级:
#1楼 得分:50回复于:2010-05-19 16:12:05
如需要阅读该回复,请登录或注册CSDN!
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:急求用过funambol的同仁,请教一些问题。
laorer
(堕落佛)
等 级:
#2楼 得分:0回复于:2010-05-19 16:28:20
谢谢回复,能不能具体说说
修改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的
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:想成为嵌入式程序员应知道的0x10个基本问题——转贴 经典!
yyy025025025
(yyy025025025)
等 级:
#3楼 得分:0回复于:2010-05-19 17:49:06
引用 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……
对的 这边会修改整个listview的属性。
我自己处理的listview的Onitemclick,会使用同样的selector,只不过我会自己设定item的状态。
通过 view.setSelected(selected);
view.setPressed(pressed)
来实现的状态转换。
所以推荐你使用第二种方法。
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:如何在程序中创建快捷方式的图标
laorer
(堕落佛)
等 级:
#4楼 得分:0回复于:2010-05-19 20:11:17
我在onItemClick事件中, view.setSelected(true); 会使得它与其他的 item不一样,但我还是不知道如何使 这个 item的颜色变成其它的颜色, 用 view.SetBackgroud吗? 我试过了,好像没效果
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:呕血整理个个精华,推荐观看!
yyy025025025
(yyy025025025)
等 级:
#5楼 得分:0回复于:2010-05-20 00:11:54
在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);
}
....
}
对我有用[0]丢个板砖[0]引用举报管理TOP
精华推荐:讨论:3G时代的到来,对手机软件开发影响会有多大呢?应用会有那些变化呢?
laorer
(堕落佛)
等 级:
#6楼 得分:0回复于:2010-05-20 09:40:21
OK, 可以了,昨天可能某个地方弄错了
谢谢了
对我有用[0]丢个板砖[0]引用举报管理TOP
laorer
(堕落佛)
等 级:
#7楼 得分:0回复于:2010-05-20 14:28:43
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
对我有用[0]丢个板砖[0]引用举报管理TOP
anbrul
(anbrul)
等 级:
#8楼 得分:0回复于:2010-07-14 17:01:07
引用 7 楼 laorer 的回复:
…… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
在getView的时候如果不是你选中的item就把背景还原回去。
对我有用[0]丢个板砖[0]引用举报管理TOP
liuxiue2010
(liuxiue2010)
等 级:
#9楼 得分:0回复于:2010-11-15 14:49:58
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
对我有用[0]丢个板砖[0]引用举报管理TOP
laorer
(堕落佛)
等 级:
#10楼 得分:0回复于:2010-11-15 17:27:09
引用 9 楼 liuxiue2010 的回复:
怎么还原啊?原来也没选中的时候也没设颜色啊。现在是所有列表选项都是选中以后的高亮状态。
你要记录本次选中的 view,以便下次判断 选中的view是不是本次的选中的 view,如果不是,你就可以按照一般的方式来设置 view了
convertView=getLayoutInflater().inflate(R.layout.itemLayout,parent, false);