以编程方式在Android中选择项目ListView

Jec*_*imi 50 android listview highlight

我有两个片段.第一个带有按钮,另一个带有ListView内部(ListFragment).

我想第一个片段(由于它的按钮)允许用户浏览第二个片段中的ListView.

所以我希望ListView由带有按钮的第一个片段控制.

我在片段之间进行通信没有问题(从第一个片段到第二个片段发送命令),但我不知道如何告诉我的ListView选择(以编程方式)特定列表项.

我应该使用什么样的ListView,如何告诉ListView选择/突出显示/聚焦其中一个项目?

当用户按下第一个片段的按钮时,我处于触摸模式.

我应该使用setFocusableInTouchMode(true)或者setChoiceMode(ListView.CHOICE_MODE_SINGLE)还是其他什么东西?

Jec*_*imi 137

这适用于所有人:

- 以编程方式选择ListView中的项目

- 使此项目保持突出显示

我正在研究Android ICS,我不知道它是否适用于所有级别的Api.

首先创建一个列表视图(如果您已经在listActivity/listFragment中,则获取它)

然后将listview的选择模式设置为单一:Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

然后以编程方式选择您的项目 :( Mylistview.setItemChecked(position, true);位置是一个整数,表示要选择的项目的排名)

现在您的项目实际上已被选中,但您可能看不到任何内容,因为没有选择的视觉反馈.现在您有两个选项:您可以使用预建的列表视图或自定义列表视图.

1)如果你想有一个预置的列表视图,给一个尝试simple_list_item_activated_1,simple_list_item_checked,simple_list_item_single_choice,等...

您可以像这样设置列表视图,例如: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

按照你选择的预建列表视图,你现在会看到,当你选择了勾选的复选框或改变了背景颜色等等...

2)如果您使用自定义列表视图,那么您将定义将在每个项目中使用的自定义布局.在此XML布局中,您将为您行中的每个零件视图定义一个选择器,该选择器需要在更改时进行更改.

假设选择此选项后,您希望您的行更改文本颜色和背景颜色.您的XML布局可以写成:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/menu_item_background_selector"
    android:orientation="horizontal" >

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textColor="@drawable/menu_item_text_selector" />
Run Code Online (Sandbox Code Playgroud)

现在,在drawable文件夹中创建menu_item_background_selector.xml和menu_item_text_selector.xml.

menu_item_text_selector.xml:

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

<item android:state_activated="true"
     android:color="#FFF">
</item>

<item android:state_pressed="true"
     android:color="#FFF">
</item>

<item android:state_pressed="false"
     android:color="#000">
</item>

</selector>
Run Code Online (Sandbox Code Playgroud)

选中后,文本将为白色.

然后为你的背景做类似的事情:(记住你不是被迫使用颜色,但你也可以使用drawables)

menu_item_background_selector.xml:

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


        <item android:state_activated="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="false"
        android:color="#ACD52B">
        </item>


      </selector>
Run Code Online (Sandbox Code Playgroud)

选中时背景为蓝色,未选中时背景为绿色.

我缺少的主要元素是android:state_activated.确实(太)许多状态:激活,按压,聚焦,检查,选择......

我不知道如果我给与为例android:state_activated并且android:state_pressed是最好的和最干净的一个,但它似乎为我工作.

但我不需要创建自己的类来获取Custom CheckableRelativeLayout(这是脏的和可怕的),也不需要使用CheckableTextViews.我不知道为什么他们使用这种方法,它可能取决于Api水平.

  • 我不认识其他人,但就我而言,我正在为背景选择器设置RelativeLayout并且应用程序崩溃(`XML Inflate exception`).我设法通过在背景drawable中更改`android:color`和`android:drawable`来实现它(无论如何你可以使用颜色).无论如何,谢谢你的解决方案,它工作得很棒 (7认同)
  • 为了安全起见,您不应将Mylistview.setChoiceMode设置为1.您应将其设置为AbsListView.CHOICE_MODE_SINGLE.目前这等于1,但他们可以在将来的api版本中更改它. (6认同)
  • 很棒的答案!但是,我可以确认这在Gingerbread和之前的版本中不起作用.(state_activated在Honeycomb中添加,API级别11.) (4认同)
  • 你忘了提到你应该使用`Mylistview.getCheckedItemPosition();`方法来检索所选项目的位置. (2认同)
  • 谢谢.并感谢@Quentin的提示,否则它可能花了我几个小时!使用android时:drawable必须使用colors.xml中指定的@ color/<customcolor>.例如:android:drawable ="@ color/pressed_color"其中"pressed_color"在colors.xml中定义为<color name ="pressed_color">#CACFD2 </ color> (2认同)

Ali*_*aka 15

试试AbsListView.performItemClick(...)

请参阅此帖子了解如何使用performItemClick.


Axe*_*xel 8

这对我有用:

1)设置List的选择行为.

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Run Code Online (Sandbox Code Playgroud)

2)设置指定位置的检查状态.

mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.
Run Code Online (Sandbox Code Playgroud)

3)在样式资源(res/values)中添加一个新样式,如下所示:

<style name="activated" parent="android:Theme.Holo">
<item name="android:background">@android:color/holo_green_light</item>
</style>
Run Code Online (Sandbox Code Playgroud)

随意使用您喜欢的颜色.

4)在ListView中使用先前定义的样式:

<ListView
        android:id="@+id/listview"
        style="@style/activated"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"/>
Run Code Online (Sandbox Code Playgroud)

或者在用作行的布局中.

<?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="wrap_content" 
  style="@style/activated"
>
  <!--widgets for your row here-->

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

希望能帮到任何人!


J_D*_*J_D 5

尝试 mListView.setSelection(position);

  • 它可以正常工作,例如,如果我放入`mListView.setSelection(20)`会将用户发送到列表的第20个项目,但是您是否有任何想法使该项目保持选中状态(或突出显示)? (5认同)
  • 好吧,实际上,就我而言,最好使用`listview.setItemChecked(position,true);`(如果需要更多详细信息,请参阅我的回答)。无论如何,谢谢您的回答:)。 (3认同)