尝试实现以下内容:两个ListViews彼此相邻,选择模式为CHOICE_MODE_SINGLE
,但每次只有一个ListView可以有一个选定的元素。因此,如果在一个ListView中选择了一个元素,则应取消选择另一个ListView的所选元素(如果可用)。
但是,每次我以编程方式取消选中其他ListView的所选项目时,当前ListView也会丢失所选项目。单击项目会显示悬停/活动状态,但不会永久选择它们。
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:listSelector="#f00"/>
<ListView
android:id="@+id/list2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:listSelector="#f00"/>
</LinearLayout>
Java代码:
public class TestActivity extends Activity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
final ListView list1 = (ListView) findViewById(R.id.list1);
final ListView list2 = (ListView) findViewById(R.id.list2);
final ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
adapter1.addAll("Test 1", "Test 2");
final ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
adapter2.addAll("Test 3", "Test 4");
list1.setAdapter(adapter1);
list2.setAdapter(adapter2);
list1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
// problem
deselect(list2);
}
});
list2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
// problem
deselect(list1);
}
});
}
private void deselect(final ListView list) {
list.clearChoices();
list.requestLayout();
// doesn't work either
//list.setItemChecked(list.getSelectedItemPosition(), false);
}
}
如果我注释掉对deselect()
的调用,那么每个ListView自行按预期工作,保留一个选定的项目。但那不是我想要的。
答案 0 :(得分:0)
找到解决方案:
我必须实现一个自定义ListAdapter,它返回实现Checkable的自定义视图。显然,ListView
只会在实施Checkable
时正确恢复所选/已检查的项目。
答案 1 :(得分:-1)
您需要消除onItemClickListener
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:listSelector="#f00"
android:onClick="clickListened"/>
然后:
public void clickListened(View view){
deselect(list2);
}
希望这会奏效。