【问题标题】:How to set color of selected item in ListFragment in android?如何在android的ListFragment中设置所选项目的颜色?
【发布时间】:2012-08-21 05:30:38
【问题描述】:

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

【问题讨论】:

标签: android listview android-listfragment


【解决方案1】:

如果您使用的是 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 中将此选择器设置为列表选择器。例如,

    <ListView
        android:id="@+id/listView1"
        android:width="wrap_content"
        android:height="wrap_content"
        android:listSelector="@drawable/selector" />
    

    看看这些例子 -

    1. ListSelector applies to the entire list

    2. ListView with selector

    3. Listview_and_list_selector

    【讨论】:

    • 谢谢,但我在哪里设置颜色?
    • @AyushGoyal 而不是 @drawable/bg_list_item_highlighted@drawable/bg_list_item_pressed 你可以在那里设置颜色。
    • 感谢您的努力,但我编辑了我的问题:它是一个 ListFragment,所以我没有任何 xml 文件。一切都应该在 java 本身中处理。
    【解决方案3】:

    为此,您必须将可绘制对象作为列表项的背景。并从lisView“选择”任何项目后,将drawable设置为透明或#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>
    

    【讨论】:

      【解决方案4】:

      如果您希望 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 });
      

      【讨论】:

        【解决方案5】:

        在 get view method() 中的适配器类中,你可以这样做 ..

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

        【讨论】:

        • 我使用了这个,但它是永久设置颜色,我想在选择其他项目时删除颜色。
        猜你喜欢
        • 2015-10-06
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 2015-04-06
        • 2021-04-26
        • 2023-03-24
        • 1970-01-01
        • 2012-09-13
        相关资源
        最近更新 更多