3

我有一个 ListView 和 listselector.xml。最初我使用 setSeletion(position) 设置项目。但是使用此代码,该项目不会突出显示。只有当我点击一个项目时它才会突出显示。

        ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
    timeListView = (ListView) findViewById(R.id.listList);
    timeListView.setAdapter(ad);
    timeListView.setOnItemClickListener(this);      
    timeListView.setSelector(R.drawable.listselector);
    timeListView.setSelection(toSelectPos);

     ============================= 
     XML      
     <ListView android:id="@+id/listList" android:layout_width="match_parent"    android:layout_height="wrap_content"  android:dividerHeight="1dp" >

listselector.xml 代码

     <?xml version="1.0" encoding="UTF-8"?>
     <!-- listselector.xml  -->
     <selector xmlns:android="http://schemas.android.com/apk/res/android">  
<!-- Selected -->
<item android:state_focused="true" android:state_selected="false"
        android:drawable="@drawable/focused"/>

<!-- Pressed -->
<item android:state_selected="true" android:state_focused="false"
        android:drawable="@drawable/selected" />     
      </selector>

上面的代码突出显示了完整的列表视图,我只想突出显示(更改背景颜色)项目。为此,我相信我将不得不为该项目创建另一个 xml 并为该项目设置选择器属性,而不是如上所述的列表。如果我错了,请纠正我。

关键是,无论如何,只有单击和 setSelection 上的选定项目应该更改。使用上面的代码,它不会改变 setSelection,如何实现。

我查看了其他 Q,但找不到我正在寻找的点,所以请不要将其标记为其他 Q 的重复项。

谢谢

4

2 回答 2

1

我不确定这是否正确,但我从 support-v4 示例的片段演示中找到了以下解决方案。

制作可检查的自定义布局并将此布局用于列表行

public class CheckableLayout extends LinearLayout implements Checkable {
    private boolean mChecked;

    public CheckableLayout (Context context) {
        super(context);
    }

    public CheckableLayout (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        // set the custom background image/color
        setBackgroundResource(checked ? R.drawable.category_item_row_selected
                : R.drawable.custom_category_item_row);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

}

将您的列表视图定义为单选模式,例如YOUR_LISTVIEW.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

单击行(inside OnItemClickListener)时,您必须将该行设置为已选中 YOUR_LISTVIEW.setItemChecked(index, true);

就是这样

于 2012-08-07T09:37:12.350 回答
0

正如您可能已经在 stack-overflow 上的一些答案中看到的那样,您不能选择视图,因为它已实现,因此用户界面必须始终处于触摸模式,如您在此处看到的那样 但是,有一些解决方法你可以做。

您可以使用以下侦听器设置 ListView onItemClick:

    OnItemClickListener itemClickListener = new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View v, int pos, long id) {

    if (v == lastSelectedView) {

    v.setBackgroundResource(0);
    lastSelectedView = null;

    } else if (v != lastSelectedView) {

    

    if (lastSelectedView != null)

        lastSelectedView
            .setBackgroundColor(android.R.color.transparent);

    lastSelectedView = v;

    v.setBackgroundDrawable(v.getContext().getResources()
        .getDrawable(R.drawable.some_row_background));
    }
}

};

在此您将根据需要为 lisview 项目着色。但是有一个问题。如果您向下或向上滚动,视图的回收将标记另一个视图。您可以在滚动时“取消选择”视图,或者您可以找到一种方法来标记视图。

最好的祝福

于 2012-08-08T08:30:12.713 回答