`
javacode23
  • 浏览: 28860 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android listView

阅读更多
再调用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);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics