我想突出显示点击自定义列表视图的项目。我尝试了不同的选择,但他们没有工作。有人能告诉我什么是错的吗?
我的自定义列表视图com.foo.ViewEditListView extends ListView implements android.widget.AdapterView.OnItemLongClickListener
list_layout.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"
android:layout_alignParentBottom="true"
android:orientation="vertical"
>
<TextView
android:id="@+id/textView_list_info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
>
</TextView>
<EditText
android:id="@+id/searchQueryText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:drawableRight="@drawable/search"
android:hint="Search Expenses by Amount"
android:textColorHint="#5e8e19"
android:inputType="numberSigned|numberDecimal"
style="@android:style/TextAppearance.Small"
>
</EditText>
<com.foo.ViewEditListView
android:id="@+id/viewExpenseListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@/drawable/list_selector_bg" //doesn't work
/>
</LinearLayout>
list_row.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@/drawable/list_selector_bg" //doesn't work
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/v_row_field1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textStyle="bold"
android:textColor="#C11B17"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@+id/v_row_field2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textStyle="bold"
android:layout_marginRight="2dp" />
</RelativeLayout>
</LinearLayout>
list_selector_bg.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="@android:drawable/list_selector_background" />
</selector>
我也尝试在Activity中设置setSelector但它们都没有工作。现在,我很无能为力。有人可以帮助我吗?
如果我将android:background =“@ / drawable / list_selector_bg”放入RelativeLayout,它只会突出显示该部分。但我想要突出整个布局。
由于 CP
答案 0 :(得分:1)
将自定义可绘制集设置为布局的背景。根据您的需要修改以下内容。按下时,您将拥有不同的背景,并且在释放时将返回默认状态。
在list_row.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"
android:layout_alignParentBottom="true"
android:background="@drawable/listbkg" // set backcground
android:orientation="vertical"
>
....
</LinearLayout>
可绘制文件夹中的listbkg.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="@drawable/pressed" /> //pressed state
<item android:state_focused="false"
android:drawable="@drawable/normal" /> // normal state
</selector>
drawable fodler中的pressed.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF1A47"/> //background color
<stroke android:width="3dp" // border color
android:color="#0FECFF"/>
<padding android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<corners android:bottomRightRadius="7dp" //for rounded corners
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
drawable文件夹中的normal.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/> // change olor
<stroke android:width="3dp" // for border color
android:color="#0FECFF" />
<padding android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<corners android:bottomRightRadius="7dp"// for rounded corners
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
编辑:
您还可以包含渐变,因为您可以在快照中看到相同的内容。
在自定义适配器的getView()中
convertView =mInflater.inflate(R.layout.list_row, parent,false);
// inflating custom layout
然后在list_row.xml中设置根布局的背景。
产生的快照
按下时会突出显示布局,然后释放将恢复正常状态。
答案 1 :(得分:0)
1)如果您想要突出显示所选项目,可以使用CustomAdapter处理它。但这不是很好的方式:)
2)我认为,最好的方法是为您的视图使用Checkable界面的常见Android实现(例如):
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private boolean mChecked;
public CheckableFrameLayout(Context context) {
super(context);
}
public CheckableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setChecked(boolean checked) {
mChecked = checked;
setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
OR
3)使用CheckedTextView
您可以在名为ApiDemos的Android Samples中找到示例(带有多重选项的ListView)。
<强>更新强>
不要忘记,ListView
必须ChoiceMode!= ListView.CHOICE_MODE_NONE
将CheckableFrameLayout
放入您的包中并像这样重写list_row.xml
:
<com.foo.CheckableFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/list_selector_bg"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/v_row_field1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textStyle="bold"
android:textColor="#C11B17"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@+id/v_row_field2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textStyle="bold"
android:layout_marginRight="2dp" />
</RelativeLayout>
</com.foo.CheckableFrameLayout>
如果您想从状态列表中获取CheckableFrameLayout
的状态(将其设置为后台),则需要覆盖list_selector_bg.xml
:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_checked="true" android:drawable="@android:drawable/list_selector_background" />
</selector>
并重写CheckableFrameLayout
以便使用它。我没有在急速中正确地完成它(我不知道为什么它只在第二次点击时才能正确地改变高亮度)。但您可以使用此代码并对其进行改进(可能使用CheckedTextView代码可以帮助您):
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {
android.R.attr.state_checked
};
private boolean mChecked;
public CheckableFrameLayout(Context context) {
super(context);
}
public CheckableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
@Override
public void setChecked(boolean checked) {
mChecked = checked;
// setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);
}
@Override
public boolean isChecked() {
return mChecked;
}
@Override
public void toggle() {
setChecked(!mChecked);
}
}