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 可能是更好的主意——这些小部件的内置列表可能已经在使用相同的标识符.
将 <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 可能是更好的主意——这些小部件的内置列表可能已经在使用相同的标识符.