1

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

1 回答 1

2

ContactsContract.Data.CONTENT_URI 是显示联系人的所有数据

你应该使用 ContactsContract.Contacts.CONTENT_URI

于 2013-02-27T07:25:13.430 回答