【问题标题】:Limit number of items in SimpleCursorAdapter when using custom content provider使用自定义内容提供程序时限制 SimpleCursorAdapter 中的项目数
【发布时间】:2016-08-19 13:07:20
【问题描述】:

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

【问题讨论】:

    标签: android sqlite android-sqlite android-contentprovider simplecursoradapter


    【解决方案1】:

    CursorAdapter 有方法getCount()。你可以像这样在你的类中实现它。

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

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

    创建这个类

    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);
    }
    

    【讨论】:

    • 我应该添加哪个类来应用这些?我的自定义内容提供商?
    • @somethingRandom 我添加了一些扩展。希望这会有所帮助。
    • 似乎不起作用,应用程序正在崩溃。当我在前面的代码上运行应用程序时,我收到错误“java.lang.IllegalStateException:只有在光标有效时才应该调用它”。所以我卸载了该应用程序并重新构建它,但现在我收到错误“java.lang.IllegalStateException:无法将光标移动到位置 0”。
    • @somethingRandom 这实际上是我的代码中的错误。将 Math.max 更改为 Math.min ))
    • 有效!虽然,是否可以简单地“提供”SimpleCursorAdapter 5 个项目,而不必创建整个类?
    【解决方案2】:

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

    在我的 customContentProvider 类中,我添加了变量:

    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();
    

    参考

    https://stackoverflow.com/a/24055457/6735035

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多