jeudi 4 juin 2015

Using Loader to display data in an AlertDialog?

I am looking for a way to display some data that are retrieved with a loader from an SQLite DB in an AlertDialog. Clicking a name in a ListView will transfer the DB entry ID to the DialogFragment, and based on this, additional data should be loaded. The loading as such does work but it seems to happen after the AlertDialog is displayed because the message box only shows Null as a value. Does anybody know if it is possible at all to transfer data into a AlertDialog like this? Thanks for your help!

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentUris;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;


@SuppressLint("SimpleDateFormat") 
public class BirthdayDetailsMessage extends DialogFragment implements
LoaderCallbacks<Cursor> {

static String DATE_FORMAT;
static final String CALENDAR = "calendar";

private long mRowId;
private String mName;
private String mDate;
private boolean mYearKnown;
private String mAge;
private Calendar mCalendar;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mCalendar = Calendar.getInstance();        

    DATE_FORMAT = PrefDateFormat.getPrefDateFormat(getActivity());

    Bundle arguments = getArguments();

    mRowId = arguments.getLong(ReminderProvider.COLUMN_ROWID); 

    getLoaderManager().initLoader(0, null, this);

     }

@Override
public Dialog onCreateDialog(Bundle savedInstanceState){   


    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());


    builder.setMessage("Birthday: "+ mDate +"\n\n"+"Age: "+ mAge)
    .setTitle(mName)
    .setCancelable(false)
    .setPositiveButton("OK",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                                        dialog.cancel();    
                }               
            }); 


   return builder.create();
}


@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(getActivity(), ContentUris.withAppendedId(
            ReminderProvider.CONTENT_URI, mRowId), null, null, null, null);
}


@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor reminder) {

    if (reminder.getCount() == 0) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                ((OnFinishEditor) getActivity()).finishEditor();
            }
        });
        return;
    }


    mName = reminder.getString(reminder
            .getColumnIndexOrThrow(ReminderProvider.COLUMN_NAME));

    mYearKnown = (reminder.getInt(reminder
            .getColumnIndexOrThrow(ReminderProvider.COLUMN_YEAR))==0? false:true);

    Long dateInMillis = reminder.getLong(reminder
            .getColumnIndexOrThrow(ReminderProvider.COLUMN_DATE));
    Date date = new Date(dateInMillis);
    mCalendar.setTime(date); 

    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
    mDate = dateFormat.format(mCalendar.getTime());


    if (mYearKnown == true){
        mAge = String.valueOf(GetDiffYears.getDiffYears(mCalendar));
    }else{
        mAge = "age not known";
    }        

}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    // nothing to reset for this fragment
}   

}

Aucun commentaire:

Enregistrer un commentaire