3

アイテムがクリックされたときにDatePickerダイアログを開くListViewonItemClickListenerがあります。

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        showDatePickerDialog(view);
    }
});

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");
}

DatePicker の日付が設定された後、データベースを更新し、ListView でクリックされた項目の日付を設定するために使用するonDateSetメソッドがあります。

public void onDateSet(DatePicker view, int year, int month, int day) {
    ...
    dataSource.updateDate(adapter.getItemId(position), month + "/" + day + "/" + year);
    ...
} 

データベースヘルパーが更新するレコードを認識できるように、クリックされた項目のListView 位置をonDateSetに渡すにはどうすればよいですか?


編集: DatePickerFragmentクラスは次のとおりです。

public static class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        ...
        dataSource.updateDate(adapter.getItemId(position), month + "/" + day + "/" + year);
        ...
    }
}

ありがとう!

4

2 に答える 2

0

次のようにして解決しました。

独自DatePickerFragmentのクラスを作成しました(クラス内にネストされていませんMainActivity):

public class DatePickerFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), (MainActivity)getActivity(), year, month, day);
    }
}

これは私のMainActivityクラスがどのように見えるかです:

public class MainActivity extends ListActivity implements DatePickerDialog.OnDateSetListener {
    private long listId = -1;
    private int listPosition = -1;
    private String date;
    ...

    protected void onCreate(Bundle savedInstanceState) {
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                listId = id;
                listPosition = position;
                showDatePickerDialog(view);
    ...

    // Show DatePicker when clicking on contact in ListView
    public void showDatePickerDialog(View view) {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getFragmentManager(), "datePicker");
    }

    // Update database and ListView adapter with selected date
    public void onDateSet(DatePicker view, int year, int month, int day) {
        date = (month + 1) + " " + day + ", " + year;
        ...
        dataSource.updateDate(listId, date);
        adapter.setDate(listPosition, date);
        ...
        adapter.notifyDataSetChanged();
        dataSource.close();
    }

補足: DatePicker のキャンセル ボタン (および Android の [戻る] ボタン) を押しても、デフォルトの日付がデータベースに保存され、アダプターが更新されます。この問題を回避するための投稿は次のとおりです: https://stackoverflow.com/a/15289569/1261256

于 2013-09-23T00:41:02.623 に答える