如何在安卓中为ListFragment中的选定项设置颜色?

3

我在 ListFragment 中有一个 listview ,它从适配器中填充数据,我想突出显示列表中被点击(或选定)的项目,并根据选择执行一些操作。我能够处理事件,但是如何设置列表中所选项目的颜色呢?


使用android:listselector - Praveenkumar
看这个。 这可能会对你有所帮助:https://dev59.com/vXI95IYBdhLWcg3wtwb4 - G_S
5个回答

7
如果您正在使用 ListFragment,那么您可能没有在XML中指定ListView,这意味着您需要在代码中设置listSelector。但是要小心不要在活动生命周期的早期设置它,否则您将遇到IllegalStateException。 level_list_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/level_gradient_bg" />

    <item android:state_pressed="true" android:drawable="@drawable/level_gradient_bg_hover" />

    <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/level_gradient_bg_hover" />
</selector>

碎片:

public class LevelFragment extends ListFragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       //Create view 
       ...
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        getListView().setSelector(R.drawable.level_list_selector);
    }
}

注意:如果您正在使用自定义布局来设置单元格行,则还需要在其上设置列表选择器。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/level_list_selector"
    android:padding="5dip" >
...
</RelativeLayout>

2

只需创建一个包含所需状态的选择器文件即可。这将为您提供解决方案。例如 -

selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <!-- Selected --> 
  <item 
    android:state_focused="true" 
    android:state_pressed="false" 
    android:drawable="@drawable/bg_list_item_highlighted" /> <!--  @drawable/tab_focus -->

  <!-- Pressed -->
  <item 
    android:state_pressed="true" 
    android:drawable="@drawable/bg_list_item_pressed" /> <!--  @drawable/tab_press -->

</selector>

在您的ListView中将此选择器设置为listselector。例如,
<ListView
    android:id="@+id/listView1"
    android:width="wrap_content"
    android:height="wrap_content"
    android:listSelector="@drawable/selector" />

请看下面这些例子——

  1. ListSelector适用于整个列表

  2. 带选择器的ListView

  3. ListView和List Selector


谢谢,但我在哪里设置颜色? - Ayush Goyal
@AyushGoyal,你可以在@drawable/bg_list_item_highlighted@drawable/bg_list_item_pressed的位置设置颜色。 - Praveenkumar
我很感激你的努力,但是我已经编辑了我的问题:它是一个ListFragment,所以我没有任何xml文件。所有的东西都应该在Java本身中处理。 - Ayush Goyal

1
如果您想在ListFragment中获得标准的ListView行为,您可以将列表项行布局设置为使用?android:attr/activatedBackgroundIndicator作为背景。像这样:

ListItem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?android:attr/activatedBackgroundIndicator" <!--This is the important bit-->
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="?android:attr/listPreferredItemHeight" />
    <TextView
        android:text=""
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minHeight="?android:attr/listPreferredItemHeight" />
</LinearLayout>

ListFragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView xmlns:tools="http://schemas.android.com/tools"
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:divider="@drawable/divider"
        android:dividerHeight="0.5dp" />
    <TextView
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="No data" />
</LinearLayout>

在您的ListFragment片段代码中,使用自定义布局(这是单行代码,但不要绝望):
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                base.OnCreateView(inflater, container, savedInstanceState);
                View view = inflater.Inflate(Resource.Layout.ListFragment, container, false);
                //... do stuff
    }

在代码中需要创建适配器的某个位置,使用ListItem布局。在这种情况下,SimpleAdapter将数据映射到图标和文本视图。ListItem.xml中的背景(?android:attr/activatedBackgroundIndicator)使该项的行为与普通列表中看到的一样:
var list = new List<IDictionary<string, object>>(listOfStuff.Count);
foreach (AMap map in listOfStuff) {
        var dictionary = new JavaDictionary<string, object> {
            {"text", map.Text}, {"icon", Resource.Drawable.SomeIcon}
        };
        list.Add(dictionary);
}
SimpleAdapter _adapter = new SimpleAdapter(Activity, list,
                                         Resource.Layout.ListItem,
                                         new string[] { "text", "icon" },
                                         new int[] { Resource.Id.text,
                                         Resource.Id.icon });

1

为此,您需要将可绘制对象设置为列表项的背景。在从lisView中“选择”任何项目后,将可绘制对象设置为透明或#000。因此,当选择项目时,您的选择器将显示。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://meta.android.com/apk/res/android">
<item android:drawable="@color/transparent" />
<item android:state_pressed="false" android:drawable="@color/BackgroundColor" />
</selector>

0

在适配器类中的getView()方法中,您可以这样做...

@Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = super.getView(position, convertView, parent);
            view.setTag(position);

            if(ur condition){
                view.setBackgroundColor(Color.TRANSPARENT);

            }else {
                view.setBackgroundColor(Color.GREEN);
            }
            return view;
        }

我使用了这个,但它会永久地设置颜色,当选择其他项目时,我想要移除颜色。 - Ayush Goyal

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