开发者

ListActivity: alter data from SQLite before putting it into the row

开发者 https://www.devze.com 2022-12-13 23:17 出处:网络
This is my ListActivity: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

This is my ListActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_list);

    mDbHelper = new MyDbAdapter(this);
    mDbHelper.open();
    fillData();

    registerForContextMenu(getListView());
}

private void fillData() {
    // Get all of the rows from the database and create the item list
    Cursor c =开发者_StackOverflow中文版 mDbHelper.fetchAllTransactions();
    startManagingCursor(c);

    // Create an array to specify the fields we want to display in the list
    String[] from = new String[]{MyDbAdapter.KEY_DATE, MyDbAdapter.KEY_NAME};

    // and an array of the fields we want to bind those fields to
    int[] to = new int[]{R.id.row_date, R.id.row_name};

    // Now create a simple cursor adapter and set it to display
    setListAdapter(new SimpleCursorAdapter(this, R.layout.my_list_row, c, from, to));
}

and this is my row layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView android:id="@+id/row_date" android:layout_width="wrap_content" android:layout_height="fill_parent" />
    <TextView android:id="@+id/row_name" android:layout_width="wrap_content" android:layout_height="fill_parent" />
</LinearLayout>

The date is actually stored as an int in the SQLLite database, and thus it displays as an integer.

Does anyone know a way to create a date from the int so it doesn't display as 1216544611 (or whatever) but as "12/11/2009 11:32"?


I suspect that you will need to write your own CursorAdapter that formats the int into a date string. The trick is to implement bindView() to format the list item before it is displayed:

private final class MyCursorAdapter extends CursorAdapter {
    MyCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override public void bindView(View view, Context context, Cursor cursor) {             

        // Format the date string
        TextView dateView = (TextView) view.findViewById(R.id.row_date);
        long millis = cursor.getLong(cursor.getColumnIndex(MyDbAdapter.KEY_DATE));
        dateView.setText(DateFormat.getDateInstance().format(new Date(milis)));

        // Do the rest of your view formatting
        ...
    }

    @Override View public newView(Context context, Cursor cursor, ViewGroup parent) {        
        View view = getLayoutInflater().inflate(R.layout.my_list_row, null);
        bindView(view, context, cursor);
        return view;        
    }
}

and connect it to your Activity in onCreate():

setListAdapter(new MyCursorAdapter(this, c));


For people like me who wonder what is under getLayoutInflater() which is not implemented or inheritied by CursorAdapter, try this :

(LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
0

精彩评论

暂无评论...
验证码 换一张
取 消