Android如何突出显示列表中的选择

时间:2011-07-21 20:41:59

标签: android listview

我想做的很简单。

我有一个填充了项目的ListFragment。如果我触摸一个项目,我希望项目的文本或背景改变颜色。这意味着此项目已被选中。现在,当我触摸另一个项目时,我希望最后一个项目恢复正常并选择新项目。

我该怎么做?

非常感谢。

编辑:

记住最后一个视图的解决方案有效,但依赖于访问最后一个视图来设置它的状态或颜色。现在这个工作。

但是我有新问题。我还有一个在列表中移动项目的功能。

这是:

public void MoveUp(){
    if (lastselected > 0){
        String item = adapter.getItem(lastselected);
        adapter.remove(item);
        adapter.insert(item, lastselected-1);           
        lastselected = lastselected -1;
        System.err.println("Is View NULL " + (getListView().getChildAt(lastselected) == null));
    }
}

问题(这就是我在第二个解决方案中坚持“在Unmark中做什么”)的原因是对于64项中的最后一项列表,函数getChildAt返回null。由于它变为null我既不能设置它的选择状态也不能设置它的颜色。

这是我的调试打印输出:

07-21 18:30:54.490: WARN/System.err(6733): Is View NULL true
07-21 18:30:54.670: WARN/System.err(6733): Is View NULL true
07-21 18:30:54.860: WARN/System.err(6733): Is View NULL true
07-21 18:30:55.020: WARN/System.err(6733): Is View NULL true
07-21 18:30:55.180: WARN/System.err(6733): Is View NULL false
07-21 18:30:55.720: WARN/System.err(6733): Is View NULL false
07-21 18:30:55.930: WARN/System.err(6733): Is View NULL false
07-21 18:30:56.110: WARN/System.err(6733): Is View NULL false
07-21 18:30:56.340: WARN/System.err(6733): Is View NULL false

我所做的就是按下向上按钮。如果我能找到某个函数来返回非空指针,那将非常感激。感谢

2 个答案:

答案 0 :(得分:3)

使用选择器(See StateList)

<?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/white" />
  <item
    android:state_selected="true"
    android:drawable="@color/selected_color" />
  <item 
    android:drawable="@color/default_color" />
</selector>

在list_item的后台,这是对上述XML的引用。

android:background="@drawable/list_item_bg_selector"

答案 1 :(得分:1)

您可以使用onListItemClick()-method来执行此操作。单击一个项目时会调用它。

然后,您可以更改背景/文本颜色并将其标记为突出显示。如果你想保护这个状态,你可以使用你班级中的一个字段来保存所选项目的ID(或其他东西)。


只是一个小插图:

public class YourFragment extends ListFragment{

    private long current_id;
    private ListView current_lv;

    public void onListItemClick (ListView l, View v, int position, long id){
        // Check if the fields are initialized:
        if (current_id != null && current_lv != null){
            // Unmark the previously selected entry:
            unmark();
        }
        // Mark the currently selected entry by using the
        // given ListView "l" and long "id"

        // Change the field-values:
        current_id = id;
        current_lv = l;
    }

    private void unmakr(){
        // Take the fields to unmark the entry
    }

}

我使用ListView和条目的ID来确定哪个是之前选择的条目,但是如果您愿意,可以使用View或其他内容。

但是你应该注意,方法给你的参数。