我有一个ListView,第一次显示它时,我想禁用它的某些项目。
为此,我做了这个textorange_selected.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:color="@color/medium_gray" />
<item android:state_selected="true"
android:color="@android:color/white" />
<item android:state_focused="true"
android:color="@android:color/white" />
<item android:state_pressed="true"
android:color="@android:color/white" />
<item android:color="@color/lighter_orange" />
</selector>
我在一行的布局中使用它:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="20dp"
android:gravity="left|center"
android:layout_width="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:background="@color/list_bg">
<ImageView
android:id="@+id/avatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginTop="10dp"
android:layout_alignParentLeft="true" />
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_toRightOf="@+id/avatar"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp">
<TextView android:id="@+id/listitem1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:textColor="@drawable/textblack_selected"
android:textSize="18dp"
android:textStyle="bold" />
<TextView android:id="@+id/listitem2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:textColor="@drawable/textorange_selected" />
</LinearLayout>
<ImageView
android:id="@+id/arrowImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_alignParentRight="true"
android:src="@drawable/arrow_selector" />
</RelativeLayout>
问题是它永远不会进入android:state_enabled="false"
(这应该是禁用该项目并且我将文本颜色设置为灰色的时刻)。
要禁用我在适配器中使用此代码的项目:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return position < 1;
}
我的错误在哪里?
选择器使用分配给它的视图上的值isEnabled()
,在本例中为 RelativeLayout
。它不会在Adapter
上调用isEnabled()
.
您将需要以下代码:
public View getView(int position, View convertView, ViewGroup parent) {
RelativeLayout v = (RelativeLayout)LayoutInflater.from(parent.getContext())
.inflate(R.layout.listitem_relativelayout, null);
if(postion < 1) v.setEnabled(false);
问题是 isEnabled()
返回的启用状态不会自动转发到列表项的所有子视图。您需要做的是在适配器的 getView()
方法结束时调用 view.setEnabled()
以使选择器正常工作。
此外,请确保通过在TextView
本身以及LinearLayout
包装器上指定android:duplicateParentState="true"
,将状态传递给后代。