我想做的很简单。
我有一个填充了项目的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
我所做的就是按下向上按钮。如果我能找到某个函数来返回非空指针,那将非常感激。感谢
答案 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
或其他内容。
但是你应该注意,方法给你的参数。