我尝试在 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/