【问题标题】:Storing/retrieving DateTime存储/检索日期时间
【发布时间】:2012-09-17 11:04:29
【问题描述】:

我有一个应用程序正在检索从 1970 年开始以毫秒为单位存储为字符串的日期,例如 1324657734883

我有一个ListView 显示这个日期。我想在数据库的这个字段中显示 joda DateTime。我的视图显示列表视图并使用startManagingCursor() 填充它,所以我认为在填充到listview 之前没有任何方法可以将milisec 格式转换为DateTime

有没有办法解决这个问题,还是我必须存储一个 DateTime,如果是,我需要声明什么列类型来存储这种类型的数据?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    nfcscannerapplication = (NfcScannerApplication) getApplication();

    // setup UI
    setContentView(R.layout.viewtransactions);
    setTitle(getCarername() + " has completed " + nfcscannerapplication.loginValidate.getNumberOfTransactions() + " visits today");
    //transactionCount = (TextView)findViewById(R.id.textviewtransactionsfordaycount);
    viewTransactions = (ListView) findViewById(R.id.listviewtransactions);

    //transactionCount.setText("You have completed 6 transactions today");

    // get data
    cursor = nfcscannerapplication.loginValidate.queryAllFromTransactions();
    startManagingCursor(cursor);

    // setup adapter and show the data




    String[] from = { 
            LoginValidate.C_NAME, LoginValidate.C_TAG_SCAN_TIME,
            LoginValidate.C_TAG_SCAN_TIME};
    int[] to = { R.id.rowcarername, R.id.rowsignedinoutstatus, R.id.rowsenttoserverat };

    adapter = new SimpleCursorAdapter(nfcscannerapplication, R.layout.rowdataactual,
            cursor, from, to);
    viewTransactions.setAdapter(adapter);


}

}

.

[更新1] 公共类 ViewTransactions 扩展 NfcBaseActivity{

private static final String TAG = ViewTransactions.class.getSimpleName();

NfcScannerApplication nfcscannerapplication;
Cursor cursor;
ListView viewTransactions;
SimpleCursorAdapter adapter;
MyAdapter myAdapter;
//TextView transactionCount; //now written to status bar

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    nfcscannerapplication = (NfcScannerApplication) getApplication();

    // setup UI
    setContentView(R.layout.viewtransactions);
    setTitle(getCarername() + " has completed " + nfcscannerapplication.loginValidate.getNumberOfTransactions() + " visits today");
    //transactionCount = (TextView)findViewById(R.id.textviewtransactionsfordaycount);
    viewTransactions = (ListView) findViewById(R.id.listviewtransactions);

    //transactionCount.setText("You have completed 6 transactions today");

    // get data
    cursor = nfcscannerapplication.loginValidate.queryAllFromTransactions();
    startManagingCursor(cursor);

    // setup adapter and show the data




    String[] from = { 
            LoginValidate.C_NAME, LoginValidate.C_TAG_SCAN_TIME,
            LoginValidate.C_TAG_SCAN_TIME};
    int[] to = { R.id.rowcarername, R.id.rowsignedinoutstatus, R.id.rowsenttoserverat };

    myAdapter = new MyAdapter(nfcscannerapplication, R.layout.rowdataactual,
            cursor, from, to);
    viewTransactions.setAdapter(adapter);


}


class MyAdapter extends SimpleCursorAdapter {

    public MyAdapter(Context context, int layout, Cursor c, String[] from,
            int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public
    View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);
        if(v == null)
            return null;

        Cursor c = (Cursor)getItem(position);
        String val = c.getString(c.getColumnIndex(LoginValidate.C_TAG_SCAN_TIME));
        Date dt = new Date(Long.parseLong(val));
        SimpleDateFormat df = new SimpleDateFormat("dd MMMM yyyy");
        String res = df.format(dt);

        ((TextView)v.findViewById(R.id.rowsignedinoutstatus)).setText(res);
        ((TextView)v.findViewById(R.id.rowsenttoserverat)).setText(res);

        return v;
    }
}

}

【问题讨论】:

  • 有一种解决方法,但您需要为此使用自己的适配器。
  • @aleks G 嗨,好的,那是使用自定义适配器之类的东西吗?你愿意给出答案,我会接受吗?
  • @turtleboy 看看答案。我还没有测试过,所以你可能需要稍微调整一下,但你应该明白了。
  • @AleksG 嗨,是的,我已经解决了,我已经用修改后的代码更新了帖子,但我的列表视图现在是空的。你有什么想法为什么。我按照你的建议实施了吗?

标签: android sqlite datetime android-listview


【解决方案1】:

创建一个扩展 SimpleCursorAdapter 的自定义适配器:

class MyAdapter extends SimpleCursorAdapter {
    @Override
    View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView();
        if(v == null)
            return null;

        Cursor c = (Cursor)getItem(position);
        String val = c.getString(c.getColumnIndex(LoginValidate.C_TAG_SCAN_TIME));
        Date dt = new Date(Long.parseLong(val));
        SimpleDateFormat df = new SimpleDateFormat("dd MMMM yyyy");
        String res = df.format(val);

        ((TextView)v.findViewById(R.id.rowsignedinoutstatus)).setText(res);
        ((TextView)v.findViewById(R.id.rowsenttoserverat)).setText(res);

        return v;
    }
}

然后用它代替默认的:

adapter = new MyAdapter(nfcscannerapplication, R.layout.rowdataactual, cursor, from, to);

【讨论】:

  • @turtleboy 哦,对不起,当然不是;它应该返回视图。我已经更新了答案。
  • 我忘记将新的自定义适配器设置为列表视图。 listview 仍然通过旧适配器。非常感谢。
【解决方案2】:

使用android.Text.DateFormat中的DateFormat

public static CharSequence getTimeStamp(long milliseconds) {
    Date d = new Date(milliseconds);
    return DateFormat.format("EEEE, MMMM dd, yyyy h:mm:ss aa", d);
}

但您必须将ArrayAdapter<String> 用于您的ListView

如果您使用LoaderManager,而不是从您的活动中管理光标,这将很容易。

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2014-01-18
    • 1970-01-01
    • 2021-08-19
    • 2020-06-02
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多