【问题标题】:strange behaviour on changing listview backgroundcolor更改列表视图背景颜色的奇怪行为
【发布时间】:2013-01-06 14:02:11
【问题描述】:

请帮助我使用列表视图。当我单击列表视图中的一个项目时,我想通过更改背景颜色来突出显示单击的项目,但是单击列表项目的背景颜色会更改多个项目。它没有不会一直发生,而是随机发生。我对这个主题进行了很多研究,尤其是 SO,但似乎没有什么对我有用。

而且我还希望更改后的颜色在整个任务中保持不变。即,即使我在活动之间切换后返回活动,所选项目也应保持突出显示。

我在 Onclick 事件中将位置保存到静态 ArrayList SELECTEDLIST。 在 GetView 方法中,我检查位置是否包含在 SELECTEDLIST 中,并相应地更改背景。

  for(String selected:TempVar.SELECTEDLIST){
        if(Integer.toString(position).equals(selected))

             {
               vi.setBackgroundResource(R.drawable.gradient_bg_hover);
             }
        else
            {
                vi.setBackgroundResource(R.drawable.gradient_bg);
            }
        }

如果我重新加载活动,只有最后一个选定的项目改变了背景颜色。但是 ArrayList Selected List 包含所有选定的 listitem 位置。我有什么遗漏吗??

编辑

   public View getView(final int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.menu_single_item, null);


        final TextView textID=(TextView)vi.findViewById(R.id.menu_single_item_id);
        final TextView textName=(TextView)vi.findViewById(R.id.menu_item_name);        
        ImageView image=(ImageView)vi.findViewById(R.id.imageMenuItem);
        ImageButton btnAddToOrder =(ImageButton)vi.findViewById(R.id.imgBtnOrder);

        HashMap<String, String> MenuItem = new HashMap<String, String>();
        MenuItem= data.get(position);
        if(!TempVar.SELECTEDLIST.isEmpty())
        {
            for(String selected:TempVar.SELECTEDLIST){
            if(Integer.toString(position).equals(selected))

             {
                   vi.setBackgroundResource(R.drawable.gradient_bg_hover);
             }
            else
                {
                           vi.setBackgroundResource(R.drawable.gradient_bg);
                }
        }
        }

        textID.setText(MenuItem.get(DBFunctions.TAG_MENU_ITEM_CODE));
        textName.setText((MenuItem.get(DBFunctions.TAG_MENU_ITEM_NAME)).toUpperCase(Locale.getDefault()));
        imageLoader.DisplayImage(MenuItem.get(DBFunctions.TAG_MENU_ITEM_IMAGE_PATH),image);

            btnAddToOrder.setOnClickListener(new View.OnClickListener()
        {   @Override
             public void onClick(View v)
                 {
                String qty = textQty.getText().toString();

                HashMap<String, String> map = new HashMap<String, String>();
                map=data.get(position);
                        TempVar.SELECTEDLIST.add(Integer.toString(position));
                HashMap<String, String> order = new HashMap<String, String>();

                order.put(DBFunctions.TAG_MENU_ITEM_CODE,map.get(DBFunctions.TAG_MENU_ITEM_CODE));
                order.put(DBFunctions.TAG_MENU_ITEM_NAME,map.get(DBFunctions.TAG_MENU_ITEM_NAME));
                TempVar.ORDERARRAYLIST.add(order);
                RelativeLayout parent =(RelativeLayout) v.getParent().getParent(); 
                parent.setBackgroundResource(R.drawable.gradient_bg_hover);

             }



        });


        return vi;
    }

【问题讨论】:

  • 你在清理你选择的列表吗???
  • 我在任务结束时清除它并在登录时再次初始化它
  • 能否添加getViewonItemClickListener代码
  • 你添加 notifydatasetchanged 了吗?
  • @sreekanth 我在哪里调用 notifydatasetchanged onclick??

标签: android listview colors background selection


【解决方案1】:

我不确定,但试试这个代码是否有效:

for(int i = 0;i< yourSelectedList.length;i++){
            if(Integer.toString(position).equals(selected)) {
                   selected = true;
                 }
               }
        if(selected){

                   vi.setBackgroundResource(R.drawable.gradient_bg_hover);
                 }
        else
                {
                    vi.setBackgroundResource(R.drawable.gradient_bg);
                }

【讨论】:

  • 它选择第一个选定项下的所有列表项。
【解决方案2】:

你的for循环错了,试试下面的截图:

    if(TempVar.SELECTEDLIST.contains(position))

         {
           vi.setBackgroundResource(R.drawable.gradient_bg_hover);
         }
    else
        {
            vi.setBackgroundResource(R.drawable.gradient_bg);
        }

【讨论】:

  • 当我尝试这个时,它根本没有进入 if true case..我必须重写 equals 和 hashcode 方法吗?
【解决方案3】:

getView()方法的btnAddToOrder.setOnClickListener中,你正在使用

HashMap<String, String> map = new HashMap<String, String>();
map = data.get(position);

这里的position不是你点击了btnAddToOrder的ListViewItem的位置,而是新创建的ListViewItem的位置,可能是 ListView 中的最后一个或第一个可见项。

去获取你点击的 btnAddToOrder 的 ListViewItem 的正确位置,使用这个:

final int actualPosition = yourListView.getPositionForView((View) v.getParent());
HashMap<String, String> map = new HashMap<String, String>();
map = data.get(actualPosition);

btnAddToOrder.setOnClickListener。其中 v 是您的 btnAddToOrder

【讨论】:

  • 可以从我的适配器类访问我的列表视图吗?
  • data 指的是arraylist 是从传递给Adapter的参数中得到的,我还是错了吗?
  • 你的 ListView 可以在 AdapterClass 中访问,如果你在构造 Adapter 时将它作为参数传递
  • 我试过这个..谢谢你的帮助..它的工作原理是一样的。我的意思是我能够突出显示选定的列表项,但是当我重新加载活动时,没有突出显示任何项目......有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多