使用自定义内容提供程序时限制 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();
参考:
我正在尝试习惯使用自定义内容提供程序。我已经成功地编写了一个非常简单的应用程序,只需按下一个按钮,就可以使用自定义内容提供程序将一个字符串添加到 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();
参考: