我尝试了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();
}
}