在listview通过 ArrayAdapter 加入了一组数据, 并监听 OnItemClickListener 事件但点击 listView的某一个Item时,已经触发了 OnItemClickListener事件,但是在item被选中时,被选中的 item周围会显示橙黄色,但有时橙黄色很快就消失了,有时还会存在,请问有什么办法解决?另外,触发 OnItemClickListener 事件后,我会重新加载数据到另一个 listView listB中,这时,原来的listView listA会失去焦点,就是在 listA 的 OnItemClickListener事件中 最后部分重新请求聚焦 listA.requestFocus() 也没有用,请问有什么办法解决
总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮谢谢
总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮谢谢
解决方案 »
- viewpager中使用viewpager,怎么监听到里面的viewpager的事件
- android 4.0 APN 接入点问题
- Android的listview里面有从文件decode的bitmap为imageview的资源的时候加载很卡怎么办?
- Android怎样获取网页点击量最高的新闻
- 求助:修改android framework源码时的出错问题
- 这个UI特效该如何实现呢?
- Android ported to Windows 7
- 安卓webview加载的网页如何放大
- 如何在程序中修改一个小小属性?
- 求帮忙 写一个自定义的圆形进度条
- android源码中有hal学习的sample么?
- 为什么看不到设计界面?
1. 修改frameworks\base\core\res\res\drawable\list_selector_background.xml2. 在adpater中定義一個變量記錄需要高亮的item,在getView中自己來實現高亮效果。
修改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的
对的 这边会修改整个listview的属性。我自己处理的listview的Onitemclick,会使用同样的selector,只不过我会自己设定item的状态。
通过 view.setSelected(selected);
view.setPressed(pressed)
来实现的状态转换。所以推荐你使用第二种方法。
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);
}
....
}
你要记录本次选中的 view,以便下次判断 选中的view是不是本次的选中的 view,如果不是,你就可以按照一般的方式来设置 view了
convertView=getLayoutInflater().inflate(R.layout.itemLayout,parent, false);
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保存某些内容,那是相当方便,是居家旅行之必备.除了上述的保持项目选中高亮的方法.谁还有更好的办法.烦劳告知啊.呵呵
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); } };
这个好使
mItemIndex = index;
notifyDataSetChanged();
} if (position == mSelectedPosition) {
convertView.setBackgroundColor(0x110000ff);
}
else {
convertView.setBackgroundColor(0x00ffffff);
}
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);
}
});