我尝试了Android API 指南ListView
中的示例。我或多或少地将示例中的代码复制到了一个活动中(我现在只省略了)。progressbar
一切正常,除了ListView
显示我设备上的每个联系人的重复项(运行 Nexus 7,Android 4.2)。
每个联系人在listview
. 我正在使用的光标已经返回了太多结果(它应该只返回 3 个项目,因为我的 Nexus atm 上只有三个联系人。)。当我检查RAW_CONTACT_ID
重复项时,总是指向相同的 id 值(即我只得到 3 个唯一 ID)。
这表明不是我的视图代码有问题。
所以问题是适配器可能出了什么问题?
为什么光标返回所有联系人的重复项?或者设备上有什么东西会导致这些重复项被退回。
我已经查看了关于 SO 的其他问题,但似乎没有一个是关于这个特定问题的。
公共类 ThemeSelectorActivity 扩展 ListActivity 实现 LoaderManager.LoaderCallbacks{ private static final String TAG = "ThemeSelector"; // 我们将从数据库中检索的行(联系人用作虚拟数据) static final String[] PROJECTION = new String[] {ContactsContract.Data._ID, ContactsContract.Data.DISPLAY_NAME}; // 获取联系人的选择条件 静态最终字符串选择 = "((" + ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Data.DISPLAY_NAME + " != '' ))"; // 用于显示列表数据的适配器 SimpleCursorAdapter mAdapter; @覆盖 public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "创建..."); super.onCreate(savedInstanceState); // 将列表视图设置为可选 getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); // 对于游标适配器,指定哪些列进入哪些视图 String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME}; int[] toViews = {android.R.id.text1}; // simple_list_item_1 中的 TextView // 创建一个空适配器,我们将使用它来显示加载的数据。 // 我们为游标传递 null,然后在 onLoadFinished() 中更新它 mAdapter = 新的 SimpleCursorAdapter(这个, android.R.layout.simple_list_item_1,空, 从列,到视图,0); setListAdapter(mAdapter); // 准备加载器。要么重新连接现有的, // 或者开始一个新的。 getLoaderManager().initLoader(0, null, this); } // 当需要创建新的 Loader 时调用 公共加载器 onCreateLoader(int id, Bundle args) { // 现在创建并返回一个 CursorLoader 来处理 // 为正在显示的数据创建一个光标。 return new CursorLoader(this, ContactsContract.Data.CONTENT_URI, 投影,选择,空,空); } // 当先前创建的加载器完成加载时调用 public void onLoadFinished(Loader loader, Cursor data) { // 交换新光标。(框架将负责关闭 // 一旦我们返回旧光标。) mAdapter.swapCursor(数据); } // 当先前创建的加载器被重置时调用,使数据不可用 公共无效onLoaderReset(加载器加载器){ // 当最后一个 Cursor 提供给 onLoadFinished() 时调用 // 以上即将关闭。我们需要确保我们不是 // 更长时间使用它。 mAdapter.swapCursor(null); } @覆盖 /** * 启动显示所选主题预览的活动 */ public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, 位置, id); //String item = (String) getListAdapter().getItem(position); //Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show(); } }