化合物ListView行的StateList

时间:2012-11-07 13:47:19

标签: android listview styles selected statelist

当我单击ListView中的一行时,该行正在使用状态列表,但不是单个元素。

  1. 在图像上设置duplicateParentState(true),文本和图像不执行任何操作。
  2. 将单个项目设置为clickable(true)会将状态列表更改应用于每个项目,但即使设置了addChildStates()(methodname的近似值),也不会更改父项目。
  3. 因此,我想单击ListView中的一行,并更新各个项的状态。显然遗漏了一些东西。

    我在ListView中有以下行:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list_row"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@drawable/statelist_row" >
    
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.1" >
    
            <ImageView
                android:id="@+id/product_image"
                style="@style/list_image"
                android:contentDescription="@string/product_image" />
    
            <ProgressBar
                android:id="@+id/product_image_progress"
                style="@style/list_image"
                android:visibility="gone" />
        </FrameLayout>
    
        <TextView
            android:id="@+id/product_name"
            style="@style/list_text"
            android:layout_weight="0.9"
            android:gravity="center_vertical" />
    
        <ImageView
            style="@style/list_caret"
            android:layout_weight="0.1"
            android:contentDescription="@string/caret" />
    
    </LinearLayout>
    

    在适配器中,我可以点击行:

        holder.productListRow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "CLICKED: '" + holder.productName.getText().toString() + "'", Toast.LENGTH_LONG).show();
            }
        });
    

    我有一个在样式中应用的状态列表:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@color/selected_item" android:state_pressed="true" android:textColor="@color/white" android:color="@color/white"/>
        <item android:drawable="@color/std_background" android:color="@color/black"/>
    
    </selector>
    

    从颜色:

    <color name="list_text_color">@drawable/statelist_produce_row</color>
    

    最后,从样式:

    <style name="list_text" parent="fill_parent">
        <item name="android:textSize">@dimen/list_text_size</item>
        <item name="android:textColor">@color/list_text_color</item>
        <item name="android:layout_gravity">left|center_vertical</item>
        <item name="android:padding">@dimen/list_text_padding</item>
        <item name="android:textStyle">bold</item>
    </style>
    

1 个答案:

答案 0 :(得分:1)

您是否应该通过为listview设置onItemClickListener而不是使每行可单击来使listview项可单击?

试试这个

mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ...
}        
});

或者如果您要扩展ListActivity,可以直接实现onListItemClick():

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    ...
}