android - ListView 示例在结果 View 中复制联系人

标签 android listview android-contacts

我尝试在 Android API guide 中找到的 ListView 示例.或多或少,我已将示例中的代码复制到一个 Activity 中(我现在只省略了 progressbar)。

一切正常,除了 ListView 显示我设备上的每个联系人的副本(运行 Nexus 7,Android 4.2)。

每个联系人在 listview 中重复 6-7 次。我使用的光标已经返回了太多结果(它应该只返回 3 个项目,因为我的 Nexus atm 上只有三个联系人。)。当我检查 RAW_CONTACT_ID 时,重复项总是指向相同的 ID 值(即我只得到 3 个唯一 ID)。

这表明不是我的 View 代码有问题。

所以问题是适配器可能出了什么问题?

为什么光标会为所有联系人返回重复项?或者设备上有什么东西导致这些重复项被返回。

我已经查看了关于 SO 的其他问题,但似乎没有一个是关于这个特定问题的。

public class ThemeSelectorActivity extends ListActivity 
                                    implements LoaderManager.LoaderCallbacks{

    private static final String TAG = "ThemeSelector";

    // The rows that we will retrieve from the db (Contacts used as dummy data)
    static final String[] PROJECTION = new String[] {ContactsContract.Data._ID,
            ContactsContract.Data.DISPLAY_NAME};

    // The select criteria for fetching contacts
    static final String SELECTION = "((" + 
            ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" +
            ContactsContract.Data.DISPLAY_NAME + " != '' ))";

    // The Adapter being used to display the list's data
    SimpleCursorAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        Log.d(TAG, "Create...");

        super.onCreate(savedInstanceState);

        // set the listview to be selectable
        getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);

        // For the cursor adapter, specify which columns go into which views
        String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME};
        int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1

        // Create an empty adapter we will use to display the loaded data.
        // We pass null for the cursor, then update it in onLoadFinished()
        mAdapter = new SimpleCursorAdapter(this, 
                android.R.layout.simple_list_item_1, null,
                fromColumns, toViews, 0);

        setListAdapter( mAdapter );

        // Prepare the loader.  Either re-connect with an existing one,
        // or start a new one.
        getLoaderManager().initLoader(0, null, this);
    }

    // Called when a new Loader needs to be created
    public Loader onCreateLoader(int id, Bundle args) {
        // Now create and return a CursorLoader that will take care of
        // creating a Cursor for the data being displayed.
        return new CursorLoader(this, ContactsContract.Data.CONTENT_URI,
                PROJECTION, SELECTION, null, null);
    }

    // Called when a previously created loader has finished loading
    public void onLoadFinished(Loader loader, Cursor data) {
        // Swap the new cursor in.  (The framework will take care of closing the
        // old cursor once we return.)
        mAdapter.swapCursor(data);
    }

    // Called when a previously created loader is reset, making the data unavailable
    public void onLoaderReset(Loader loader) {
        // This is called when the last Cursor provided to onLoadFinished()
        // above is about to be closed.  We need to make sure we are no
        // longer using it.
        mAdapter.swapCursor(null);
    }

    @Override
    /**
     * Start activity that shows a preview of the selected theme
     */
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        //String item = (String) getListAdapter().getItem(position);
        //Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
    }   
}

最佳答案

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

你应该使用 ContactsContract.Contacts.CONTENT_URI

关于android - ListView 示例在结果 View 中复制联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13455471/

相关文章:

c# - 使用 LIKE 表达式时 SQLite 中的土耳其字符

android - 什么是 CoordinatorLayout?

android - 有时无法删除 listview-sqlite 中的项目

android - ListView Android 不允许选择器工作,也不允许选择

android - 如何在android中显示所有消息选项的对话框?

安卓udp丢包

Android ItemizedOverlay<OverlayItem> 问题

C# Listview 拖放行

android - 为什么 Duo、whatsapp、skype 等应用程序在 native 联系人的 RawContact 表中具有条目

android - 如何使用google contacts api以编程方式将手机联系人同步到android中的gmail