使用自定义内容提供程序时限制 SimpleCursorAdapter 中的项目数

Limit number of items in SimpleCursorAdapter when using custom content provider

我正在尝试习惯使用自定义内容提供程序。我已经成功地编写了一个非常简单的应用程序,只需按下一个按钮,就可以使用自定义内容提供程序将一个字符串添加到 sqlite 数据库中。然后,这些数据库条目显示在相同 activity.

的 ListView 中

我试图将 ListView 中的项目数限制为 5,但由于我缺乏经验,我不知道如何进行。

这就是我用来填充 ListView 的内容

private void fillData() {

    String[] from = new String[]{commentsTable.COLUMN_COMMENT, commentsTable.COLUMN_ID};
    int[] to = new int[]{android.R.id.text1, android.R.id.text2};

    getLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, null, from, to, 0);

    setListAdapter(adapter);
}

我按照本教程http://www.vogella.com/tutorials/AndroidSQLite/article.html#tutorial-sqlite-custom-contentprovider-and-loader编写了一个与教程中的应用程序类似的应用程序。

我尝试使用 Cursor 而不是 null,但由于 .getWritableDatabase().

方法,我收到 java.lang.NullPointerException 错误

CursorAdapter 有方法 getCount()。您可以像这样在 class 中实现它。

public int getCount() {
    int superCount = super.getCount();
    return Math.min(superCount, 5);
}

所以需要继承SimpleCursorAdapter并重新定义方法getCursor().

将此打包 class

public class CustomCursorAdapter extends SimpleCursorAdapter {

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

    @Override
    public int getCount() {
        int superCount = super.getCount();
        return Math.min(superCount, 5);
    }
}

并在您的代码中将 SimpleCursorAdapter 更改为 CustomCursorAdapter

private void fillData() {

    String[] from = new String[]{commentsTable.COLUMN_COMMENT, commentsTable.COLUMN_ID};
    int[] to = new int[]{android.R.id.text1, android.R.id.text2};

    getLoaderManager().initLoader(0, null, this);
    adapter = new CustomCursorAdapter(this, android.R.layout.two_line_list_item, null, from, to, 0);

    setListAdapter(adapter);
}

经过一些研究,我设法解决了这个问题,并认为我会 post 为任何偶然发现这个问题的人提供答案。

在我的 customContentProvider class 我添加了变量:

public static final String QUERY_PARAMETER_LIMIT = "limit";
public static final String QUERY_PARAMETER_OFFSET = "offset";

然后编辑查询方法以包括:

public Cursor query(Uri uri, ...) {
    String limit = uri.getQueryParameter(QUERY_PARAMETER_LIMIT);
    String offset = uri.getQueryParameter(QUERY_PARAMETER_OFFSET);

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

    // ...

    Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder, limitString);

    //...

    return c;
}

然后在获取游标时只需使用 Uri

Uri CONTENT_URI = customContentProvider.CONTENT_URI.buildUpon()
            .appendQueryParameter(customContentProvider.QUERY_PARAMETER_LIMIT,
                    String.valueOf(limit))
            .appendQueryParameter(customContentProvider.QUERY_PARAMETER_OFFSET,
                    String.valueOf(offset))
            .build();

参考: