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

时间:2015-03-04 20:16:00

标签: android listactivity android-datepicker

在我的布局XML中插入<DatePicker>元素会导致我的应用崩溃:

  

java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.CalendarView $ WeekView

在我的游标加载之前可见,但是格式错误并且不显示月中的日期:

Malformed DateSelector

为了演示,这里是一个示例布局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()正在控制ListView中使用的DatePicker而不是ListView我的XML中的DatePicker。在ListView之后放置DatePicker可以解决问题,但这似乎很脆弱。我猜@android:id/list的列表也使用了setListAdapter()

这是一个错误吗?我错误地使用{{1}}了吗?我应该完全避免在ListActivity中使用DatePicker吗?

1 个答案:

答案 0 :(得分:1)

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

另外在旁注中,我通常只在必须显示列表(可能是一个简单的小部件)时才使用ListActivity。当你必须使用ViewGroups(如在DatePicker,TimePicker等中)时,最好不要因为你提到的原因而特别使用ListActivity - 这些小部件的固定列表可能已经在使用相同的标识符