몇 가지 질문을 할 수있을 것 같아요. 지금까지 특정 유형의 데이터 (현재 DISPLAY_NAME, NUMBER 및 ADDRESS)에 대한 Android 주소록 데이터베이스를 쿼리하는 애플리케이션이 있습니다. 그런 다음 커서 쿼리 결과를 ListView에 채 웁니다. 내 문제는, 나는 3 개의 별도 커서를 사용하여 데이터를 가져 왔으며, 나는 ListView 행 (R.id.contact_name, R.id.contact_number, R.id.)에있는 모든 항목을 3 개의 항목에 바인딩하려고합니다. 연락처).안드로이드 멀티 테이블 커서 목록보기를 채우는
3 개의 다른 커서를 사용하여이 작업을 수행하는 방법을 잘 모르겠으며 지난 몇 일 동안 둘러 본 후에 "MergeCursor?"와 같은 몇 가지 구문을 제외하고는 실제 지침을 찾을 수 없었습니다. sp) 또는 데이터베이스 테이블을 함께 결합하려고합니다. 또한 onCreate() 내 목록을 채우고 싶지 않습니다. AsyncTask의 doInBackground()에서 일부 사용자는 많은 연락처를 가질 수 있기 때문에 UI 스레드를 차단하고 싶지는 않습니다. 이미 발생하고 있습니다. 하지만 비동기로 개체수를 구현하려고하면 Eclipse에서 SimpleCursorAdapter에 대한 많은 오류를 표시합니다. 여기에 현재 코드가 있습니다. 이 아키텍처를 개선하고 내가 겪고있는 문제를 해결하는 방법에 대한 지침은 크게 감사 할 것입니다. 감사합니다!
public class Contacts extends ListActivity {
private static final String TAG = "Contacts";
Cursor c, pCur, addrCur;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri contacts = ContactsContract.Contacts.CONTENT_URI;
ContentResolver cr = getContentResolver();
String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME };
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
Log.d(TAG, "Getting Display Names....");
// Query the Contacts Content Provider for ONLY Contacts that have phone
// numbers
// listed
c = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null,
sortOrder);
// Get their display names
if (c.getCount() > 0) {
// While there is more data
while (c.moveToNext()
&& Integer
.parseInt(c.getString(c
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
String id = c.getString(c
.getColumnIndex(ContactsContract.Contacts._ID));
String name = c
.getString(c
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// Query Phone Numbers Next
/*
* if (Integer .parseInt(c.getString(c
* .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
* > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
* ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
* ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" ,
* new String[]{id}, null); while (pCur.moveToNext()) {
*
* String phone_number = pCur .getString(pCur
* .getColumnIndex(ContactsContract
* .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG,
* "Finished Getting Phone Numbers...."); }
*/
// Query the Addresses
Log.d(TAG, "Getting Addresses....");
String addrWhere = ContactsContract.Data.CONTACT_ID
+ " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] addWhereParams = new String[] {
id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE };
addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null,
null, null, null);
while (addrCur.moveToNext()) {
String poBox = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur
.getString(addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
}
addrCur.close();
Log.d(TAG, "Finished Getting Addresses....");
}
}
// new loadContacts().execute(TAG);
final int[] TO = { R.id.contact_name };
final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.contact_item, c, FROM, TO);
setListAdapter(adapter);
// adapter.changeCursor(pCur);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
c.moveToPosition(position);
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Toast.makeText(this, "You Selected " + name, Toast.LENGTH_SHORT).show();
//Toast t = Toast.makeText(Contacts.this, "You Selected " + position, Toast.LENGTH_SHORT);
//t.show();
}
}
아마도 ListView에 대한 고유 한 어댑터를 정의하고 쿼리 결과를 어댑터에 병합하는 것이 좋습니다. –