2012-04-05 76 views
9

我有两个片段的布局。左边的片段是一个使用SimpleCursorAdaptor的ListFragment,右边的片段填充了左边片段列表中选择的项目的详细信息。我试图找出如何确保ListFragment 中的选定项目保持高亮显示,直到选中列表中的其他项目。为片段中的选定项目维护高亮显示?

经过一些研究,我尽可能地尝试使用android:background="@drawable/item_selector"我可以改变不同状态的颜色,但它们都不会持续。我认为选定的会......只是看起来合乎逻辑的是,您选择的项目仍然是选定的项目,直到您选择不同的项目为止。

我甚至试图在我的clickhandler中使用v.setSelected(true);希望它可以维持状态,但那也不起作用。

是否有我缺少的状态?我通过开发文档看了一下,没有别的似乎是适当的...

item_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_pressed="true" 
     android:drawable="@color/green" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/blue" /> 
</selector> 

我不知道还有什么其他的代码也许会有帮助,所以随意问任何你可能认为有必要。

+0

我知道th是旧的,但是选择器是否需要一个没有限定符的元素,如果没有可匹配的元素? – Mgamerz 2014-03-05 16:37:44

回答

12

答案是在进一步研究后的android文档中(文档的两个部分真的)。

首先,在触摸模式下没有选择或聚焦的状态。

其次,默认情况下,列表视图设置为none的选项模式(意味着列表中没有项目可以具有选定状态)。我所要做的就是改变选择模式(可以是单个或多个,我只需要/想单)加入这样的:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

然后我用我的选择XML选择状态(转换至activated状态):

<item 
android:state_activated="true" 
android:drawable="@color/blue" /> 

应用,在该行布局XML文件作为背景:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="35dp" 
    android:background="@drawable/item_selector" 
    android:gravity="center_vertical"/> 

我选择的项目现在有一个蓝色的背景,直到出现一个不同的项目我被选中。

请注意,此(android:state_activated)需要Android API 11或更高版本。

+2

android:state_activated至少需要API级别11 – eftokay83 2012-08-22 14:46:00

+3

不适用于我 – Shine 2013-01-05 17:50:37

+0

为我工作!! – 2013-05-27 09:49:58

1

我相信你还需要添加state_focused,以使它感觉像被选中或突出显示。

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_pressed="true" 
     android:drawable="@color/green" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/blue" /> 

    <item 
     android:state_focused="true" 
     android:drawable="@color/red" /> 
</selector> 
+1

感谢您的建议。我试了一下,但还是没有运气。 ( – Barak 2012-04-05 13:29:50

0

这对ListFragment我很好,但我认为它只适用于Android 4.0及更高版本。我为android:background="?android:attr/activatedBackgroundIndicator创建了一个列表项的简单布局(Android的情况下为4以下)。0您需要ceate中可绘制类似的一个):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:background="?android:attr/activatedBackgroundIndicator" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/list_item_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:layout_margin="@dimen/double_view_margin" /> 

,然后使用此布局仅创建一个简单ArrayAdapter,并设置选择模式单一:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); 

setListAdapter(labelsAdapter); 

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

后你可以用setItemChecked方法来照亮必要的物品:

@Override 
public void onListItemClick(final ListView l, final View v, final int position, final long id) { 
    getListView().setItemChecked(position, true); 
}