我尝试在Android API guide中找到的ListView示例 . 或多或少我在列表视图中复制了6到7次 . 光标我'm using already returns too many results (it should only return 3 items as I only have three contacts on my Nexus atm.). When I checked the RAW_CONTACT_ID the duplicates always point to the same id values (i.e. I only get 3 unique ID' s) . 这表明我的视图代码不是有问题的 .
所以问题是适配器可能出现什么问题?为什么光标会为所有联系人返回重复项?或者设备上是否存在导致返回这些重复项的内容 .
我已经查看过关于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();
}
}
1 回答
ContactsContract.Data.CONTENT_URI显示所有联系人数据
你应该使用ContactsContract.Contacts.CONTENT_URI