当按下Android ListView条目时更改图标

3

我目前正在尝试在Android中实现一个ListView,其中包含具有图标和描述文本的行。当用户按下一行时,背景颜色应更改,并且应如下图所示替换图标。normal and pressed state

使用选择器更改背景没有问题。但是我无法想出一种简单的方法来更改图标。我尝试添加两个重叠的图标:

<RelativeLayout
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/general_list_item_icon"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="centerInside" />

    <ImageView
        android:id="@+id/general_list_item_icon_active"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="gone" />
</RelativeLayout>

我在每个ImageView中放置了一个可绘制对象,并希望在用户按下行时切换可见性。是否有可能使用类似于背景选择器的选择器来实现此操作?

另外:由于ListView是动态填充的,因此使用具有静态可绘制对象引用的选择器无效。


您可以使用ListView的选择/触摸事件来处理图标切换。我认为您无法在XML中引用动态图像。 - Tom Dezentje
我已经考虑过使用事件监听器,但那似乎太麻烦了。由于可以使用选择器更改背景颜色,我认为也可能有一种方法来控制可见性。这样我就可以链接两张图片,然后只显示其中的一张。我只是不知道如何实现它...已经尝试了许多方法。 - gtRfnkN
为了更改图标,您可以使用列表项的状态更改侦听器,并相应地更改图像视图。 - Gaurav Arora
抱歉,我的意思是按下状态。但是,如果使用选择器,我只能传递一个可绘制对象,而且由于它是动态设置的,我无法真正使用它...所以在我脑海中最好的情况是:更改每个项目的可见性...但我不确定是否可能。 - gtRfnkN
2个回答

9
你可以使用setChoiceMode
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

在调用 setAdapter 方法之前,请调用此方法。并且重写你的适配器的 getview 方法。 示例代码。
public View getView(int position, View convertView,
                    ViewGroup parent) {
                if(convertView!=null){
                    ImageView img = (ImageView)convertView.findViewById(R.id.imageView1);
                    if(mylist.isItemChecked(position)){
                        convertView.setBackgroundColor(Color.WHITE);// here you can set any color.
                        img.setImageResource(R.drawable.img1);//img1 is stored in your rawable folder.
                    }else{
                        convertView.setBackgroundColor(0);
                        img.setImageResource(R.drawable.img2);
                    }
                }
                return super.getView(position, convertView, parent);
            }

我希望这可以为您提供所需的解决方案。祝您一切顺利。谢谢。


1
我正准备做类似的事情,你的答案帮助我让它工作了。非常感谢 :-) - gtRfnkN
1
只需将您的ListView传递到Adapter构造函数中即可调用isItemChecked。谢谢! - Roman

1
这是我的解决方案,适用于我:
public void setNavDrawerItemNormal()
    {
        for (int i=0; i< mDrawerList.getChildCount(); i++)
        {
            View v = mDrawerList.getChildAt(i);
            ImageView icon = ((ImageView) v.findViewById(R.id.icon));
            icon.setImageResource(navMenuIcons.getResourceId(0, -1));
        }
    }



private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {

            //adapter.notifyDataSetChanged();

            setNavDrawerItemNormal();
            if(view!=null) {
                ImageView img = (ImageView) view.findViewById(R.id.icon);
                img.setImageResource(R.drawable.abs__ic_go);//img1 is stored in your rawable folder.
            }


            // display view for selected nav drawer item
            displayView(position);




        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接