【问题标题】:ListView with CursorLoader and SimpleCursorAdapter isn't displaying data带有 CursorLoader 和 SimpleCursorAdapter 的 ListView 不显示数据
【发布时间】:2012-10-19 19:43:16
【问题描述】:

我正在尝试使用 CursorLoader 使用来自查询的数据填充 ListView。我是 CursorLoaders 的新手,我正在使用从开始 Android 4 应用程序开发中窃取的代码。如您所见,我正在从 Intent 获取数据。 Intent 中的数据就是我想要的;我已经在调试器中验证了这一点。但是,当我查询我的数据库时,ListView 中没有显示任何内容。有人可以帮忙吗?

public class MyList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {

private static final String TABLE_BASEPATH = "tbl";
private static final String AUTHORITY = "SQLData";
public static final Uri MY_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_BASEPATH);    

@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent myData = getIntent();
    Bundle info = myData.getExtras();

    if (info != null){
        Cursor c;
        String[] dataColumns = { "mycolumn" };
        String selection = "level = '" + info.getString("Level") + "'";

        if (android.os.Build.VERSION.SDK_INT < 11)
            c = managedQuery(MY_URI, dataColumns, selection, null, "ORDER BY mycolumn");
        else
        {
            CursorLoader cursorloader = new CursorLoader(this, MY_URI, dataColumns, selection, null, "ORDER BY mycolumn");
            c = cursorloader.loadInBackground();
        }

        int[] viewIDs = { R.id.mylist1 };
        SimpleCursorAdapter adapter;

        if (android.os.Build.VERSION.SDK_INT < 11)
            adapter = new SimpleCursorAdapter(this, R.layout.mylist, c, dataColumns, viewIDs);
        else
            adapter = new SimpleCursorAdapter(this, R.layout.mylist, c, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        this.setListAdapter(adapter);
    }
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(this, MY_URI,
            PROJECTION, null, null, null);  
}

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
      case LOADER_ID:
        mAdapter.swapCursor(cursor);
        break;
    }

}

public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);

}

我使用的是光标还是 CursorLoader 都没有关系。如果我的版本 11 (CursorLoader) 我仍然没有数据。

【问题讨论】:

  • 您发布的代码似乎没有问题,但您发布的内容不多...请在您的问题中添加 3 个 CursorLoader 方法,问题可能就在那里。 (虽然我很好奇你为什么不简单地使用支持库来实现向后兼容性。)
  • 嗯,那可能是因为我不知道自己在做什么。 ;) 我是一个 Android 菜鸟。我的应用程序可以使用光标,但我正在尝试升级到 CursorLoaders 并且正在经历一段魔鬼时期。只是不明白这里发生了什么。而且我不知道您所说的支持库是什么意思;请详细说明。我的 Activity 中有 CursorLoader 方法,但它们什么都不做。我不知道他们应该做什么。我一直在网上搜索,对我来说没有任何意义。一个简单的例子会非常非常有帮助。谢谢!
  • 我注意到,当我运行查询时,我在 LogCat 中看到消息“无法找到 SQLData 的提供程序信息”。 SQLData 是我的类,它定义了我的数据库。我以为那是提供者。我是否必须为我的数据库定义自定义内容提供程序?
  • Sam - 这是我的 3 个 CursorLoader 方法,值得:
  • public Loader onCreateLoader(int id, Bundle args) { return new CursorLoader(this, MY_URI, PROJECTION, null, null, null); } public void onLoadFinished(Loader loader, Cursor cursor) { switch (loader.getId()) { case LOADER_ID: mAdapter.swapCursor(cursor);休息; } } public void onLoaderReset(Loader loader) { mAdapter.swapCursor(null); }

标签: android


【解决方案1】:

在使用 ContentProvider 时,您需要在投影中放入 id 列,否则它们“将不起作用”。我认为您正在做的 > api 级别 11...

String[] dataColumns = { "mycolumn" };

上面的代码应该包含 id 字段。如果 id 字段是“_id”(如 Sams 回答):

String[] dataColumns = { "mycolumn", "_id" };

【讨论】:

  • 谢谢你,尼古拉斯。我没有意识到这是这里的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多