setListAdapter 在 ListActivity 中设置 DatePicker 列表而不是我的 ListView

setListAdapter sets the DatePicker list instead of my ListView in ListActivity

<DatePicker> 元素插入我的布局 XML 使我的应用程序崩溃:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.CalendarView$WeekView

在我的 Cursors 加载之前它是可见的,但格式不正确并且不显示该月的天数:

为了演示,这里有一个示例布局 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <DatePicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

还有一些 java 可以配合使用:

public class TestDatePicker extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_date_picker);

        DatePickerAdapter myAdapter = new DatePickerAdapter();
        setListAdapter(myAdapter);
    }
}

class DatePickerAdapter extends BaseAdapter {
    @Override
    public int getCount() { return 0; }

    @Override
    public Object getItem(int i) { return null; }

    @Override
    public long getItemId(int i) { return 0; }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) { return null;}
}

我发现在这个简单的示例中,我的 <DatePicker> 搞砸了,因为 setListAdapter() 正在控制 DatePicker 中使用的 ListView 而不是ListView 在我的 XML 中。在 ListView 之后放置 DatePicker 可以解决问题,但这看起来很脆弱。我猜 DatePicker 的列表也使用 @android:id/list

这是一个错误吗?我使用 setListAdapter() 不正确吗?我应该完全避免在 ListActivity 中使用 DatePicker 吗?

是的,看起来 DatePicker 确实使用了具有相同标识符的列表。 Android 框架开发人员推荐的是在它自己的 DialogFragment(http://developer.android.com/guide/topics/ui/controls/pickers.html) 中托管 DatePicker。由于您在 DialogFragment 中不需要它,我建议将 DatePicker 放在它自己的 Fragment 中(如果它应该是显示的一部分而不是对话框)并让 ListView 对象成为 ListFragment 的一部分并让您的 activity 显示这两个片段。这样他们中的任何一个都不会相互交互,您仍然会得到预期的行为。

另外,我通常只在必须显示列表(可能还有一个简单的小部件)时才使用 ListActivity。当您必须使用 ViewGroups(如 DatePicker、TimePicker 等)时,出于您提到的原因特别避免使用 ListActivity 可能是更好的主意——这些小部件的内置列表可能已经在使用相同的标识符.