0

摘要:我确实有一个简单的应用程序(演示/原型),其中包含显示项目列表(这里是客户)的活动。这些项目是从应用程序 SQLite 数据库中检索的。我正在使用ContentProvider带有LoaderManagerand的方法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;
}
4

2 回答 2

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);
于 2013-04-26T12:27:16.570 回答
1

它可以是您活动中的局部变量。

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

如果您将您LoaderCallbacks的活动移至活动之外的类,则可以将其作为实现的字段LoaderCallbacks,并将其传递给构造函数或设置器。

于 2013-04-26T12:24:18.383 回答