在listview通过 ArrayAdapter 加入了一组数据, 并监听 OnItemClickListener 事件但点击 listView的某一个Item时,已经触发了 OnItemClickListener事件,但是在item被选中时,被选中的 item周围会显示橙黄色,但有时橙黄色很快就消失了,有时还会存在,请问有什么办法解决?另外,触发 OnItemClickListener 事件后,我会重新加载数据到另一个 listView listB中,这时,原来的listView listA会失去焦点,就是在 listA 的 OnItemClickListener事件中 最后部分重新请求聚焦 listA.requestFocus() 也没有用,请问有什么办法解决
总之,问题如下,如何保证触发 OnItemClickListener事件时,被选中的 item能显示明显的显示出来被选中了,同时在 listView 失去焦点时,也能够使被选中的Item高亮谢谢

解决方案 »

  1.   

    方法有兩個:
    1. 修改frameworks\base\core\res\res\drawable\list_selector_background.xml2. 在adpater中定義一個變量記錄需要高亮的item,在getView中自己來實現高亮效果。
      

  2.   

    谢谢回复,能不能具体说说
     修改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的
      

  3.   


    对的  这边会修改整个listview的属性。我自己处理的listview的Onitemclick,会使用同样的selector,只不过我会自己设定item的状态。
    通过    view.setSelected(selected);
            view.setPressed(pressed)
    来实现的状态转换。所以推荐你使用第二种方法。
      

  4.   

    我在onItemClick事件中, view.setSelected(true); 会使得它与其他的 item不一样,但我还是不知道如何使 这个 item的颜色变成其它的颜色, 用  view.SetBackgroud吗?  我试过了,好像没效果
      

  5.   

    在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);
    }
     ....
    }
                   
      

  6.   

    …… 我没办法只是被选中的高亮,现在出现的情况是原来被选中的仍在高亮,我不知道在哪里重设原来的被选中的Item的颜色
      

  7.   

    在getView的时候如果不是你选中的item就把背景还原回去。
      

  8.   


    你要记录本次选中的 view,以便下次判断 选中的view是不是本次的选中的 view,如果不是,你就可以按照一般的方式来设置 view了
    convertView=getLayoutInflater().inflate(R.layout.itemLayout,parent, false); 
      

  9.   

    网上的方法,感觉更好使:
    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保存某些内容,那是相当方便,是居家旅行之必备.除了上述的保持项目选中高亮的方法.谁还有更好的办法.烦劳告知啊.呵呵
      

  10.   

    不错,
      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);  }  };
    这个好使
      

  11.   

    在public void setSelectItem(int index){
      mItemIndex = index;
      notifyDataSetChanged();
      }            if (position == mSelectedPosition) {
                 convertView.setBackgroundColor(0x110000ff);
    }
                else {
                 convertView.setBackgroundColor(0x00ffffff);
    }
      

  12.   

    哥们,给你个靠谱的答案吧,参考。http://blog.csdn.net/zhiyou007/article/details/6438493
      

  13.   

    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);
    }
    });