如何通过菜单更改活动中列表项的顺序?

时间:2013-04-26 12:00:03

标签: android android-sqlite

摘要:我确实有一个简单的应用程序(演示/原型),其中包含显示项目列表的活动(此处为客户)。这些项目从应用程序SQLite数据库中检索。我在ContentProviderLoaderManager使用SimpleCursorAdapter方法。我需要将用户的菜单项选择转换为选择的排序列表方式。通常的做法是什么?应该如何保存用户选择以备将来使用? (我是关于Android编程的初学者。)

详细信息:在我的活动onCreate方法中,调用fillData方法(请参阅下面的代码,从教程中学习)来填充列表。它调用getLoaderManager().initLoader(0, null, this);,然后调用返回onCreateLoader实例的CursorLoader。游标加载器使用内容提供程序并传递定义排序的参数。到目前为止,我使用固定的参数来排序列表。我的猜测是,在处理菜单项单击时我应该调用fillData();。它应该导致创建另一个加载器和另一个适配器但是如何将信息传递给onCreateLoader

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.insert_customer:   // this already works for me
        createCustomer();
        return true;

    case R.id.customers_orderby_name_asc:
        ???                      // What should be here?
        fillData();              // I should probably call this.
        return true:

    case R.id.customers_orderby_name_desc:
        ???
        fillData();
        return true:
    }
    return super.onOptionsItemSelected(item);
}
...
private void fillData() {
    String[] from = new String[] { CustomerTable.COLUMN_CODE,
                                   CustomerTable.COLUMN_NAME,
                                   CustomerTable.COLUMN_TOWN,
                                   CustomerTable.COLUMN_STREET};
    int[] to = new int[] { R.id.code, R.id.name, R.id.town, R.id.street };

    getLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this,
            R.layout.customer_row, null, from, to, 0);
    setListAdapter(adapter);
}

// After initLoader()...
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { CustomerTable.COLUMN_ID,
                            CustomerTable.COLUMN_CODE,
                            CustomerTable.COLUMN_NAME,
                            CustomerTable.COLUMN_STREET,
                            CustomerTable.COLUMN_TOWN };
    CursorLoader cursorLoader = new CursorLoader(this,
            DemoContentProvider.CUSTOMERS_CONTENT_URI, projection, null, null,
            CustomerTable.COLUMN_NAME);  // here fixed order by the column
    return cursorLoader;
}

2 个答案:

答案 0 :(得分:1)

它可以是您活动中的本地变量。

列名可以写在SharedPrefs中供以后使用(或立即使用)。

如果您将LoaderCallbacks移到活动之外的某个班级,则可以将其设为LoaderCallbacks实施的字段,并将其传递给构造函数或设置器。

答案 1 :(得分:1)

此CustomerTable.COLUMN_NAME表示订购,对吗?所以创建几个方法,只需在这个地方进行更改,如

创建一个方法,将排序列作为参数:

public Loader<Cursor> onCreateLoader(int id, Bundle args, String orderByColumn)
...
     CursorLoader cursorLoader = new CursorLoader(this,
                DemoContentProvider.CUSTOMERS_CONTENT_URI, projection, null, null,
                orderByColumn == null ? CustomerTable.COLUMN_NAME : orderByColumn);

或使用某些类的字段,如

...
private String orderByColumn;
...
    public Loader<Cursor> onCreateLoader(int id, Bundle args)
    ...
         CursorLoader cursorLoader = new CursorLoader(this,
                    DemoContentProvider.CUSTOMERS_CONTENT_URI, projection, null, null,
                    orderByColumn == null ? CustomerTable.COLUMN_NAME : orderByColumn);