两个带有singleChoice的ListView,但一次只选择一个

时间:2014-03-14 14:21:20

标签: android listview android-listview

尝试实现以下内容:两个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自行按预期工作,保留一个选定的项目。但那不是我想要的。

2 个答案:

答案 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);
    }

希望这会奏效。