2010-10-07 34 views
5

Tôi có một danh sáchXem các liên hệ mà tôi nhận được từ mẫu Android ContactManager. Danh sách này hiển thị tốt, nhưng tôi không thể tìm ra cách nhận thông tin từ mục đã chọn, như "tên" và "số điện thoại".getItemAtPosition() Cách lấy dữ liệu có thể đọc từ mục đã chọn trong ListView

Tôi có thể nhận được vị trí đã chọn, nhưng kết quả của mContactList.getItemAtPosition (vị trí) là một ContentResolver $ CursorWrapperInner và điều đó không thực sự có ý nghĩa với tôi. Tôi không thể nhận được đầu hoặc đuôi từ đó.

Bất kỳ ai cũng biết cách tôi có thể lấy tên/id/số điện thoại từ mục đã chọn trong listView?

Đây là mã của tôi.

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.v(TAG, "Activity State: onCreate()"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.choose_contact); 

    // Obtain handles to UI objects 
    mAddAccountButton = (Button) findViewById(R.id.addContactButton); 
    mContactList = (ListView) findViewById(R.id.contactList); 
    mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible); 

    // Initialize class properties 
    mShowInvisible = false; 
    mShowInvisibleControl.setChecked(mShowInvisible); 
    mContactList.setOnItemClickListener(new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
     addContactAt(position); 
     } 
    }); 
    mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Log.d(TAG, "mShowInvisibleControl changed: " + isChecked); 
      mShowInvisible = isChecked; 
      populateContactList(); 
     } 
    }); 

    // Populate the contact list 
    populateContactList(); 

} 

/** 
* Populate the contact list based on account currently selected in the account spinner. 
*/ 
private SimpleCursorAdapter adapter; 
private void populateContactList() { 
    // Build adapter with contact entries 
    Cursor cursor = getContacts(); 
    String[] fields = new String[] { 
      ContactsContract.Data.DISPLAY_NAME 
    }; 
    adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, 
      fields, new int[] {R.id.contactEntryText}); 
    mContactList.setAdapter(adapter); 
} 

/** 
* Obtains the contact list for the currently selected account. 
* 
* @return A cursor for for accessing the contact list. 
*/ 
private Cursor getContacts() 
{ 
    // Run query 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

private void addContactAt(int position) 
{ 
Object o = mContactList.getItemAtPosition(position); 
} 

} `

Trả lời

5

BOOM! I figured it out. Về cơ bản bạn nhận được số vị trí từ sự kiện nhấp chuột, sau đó trong addContatAt() của tôi, bạn sử dụng vị trí đó để tìm kiếm trong con trỏ cho trường mà bạn muốn. Trong trường hợp của tôi, tôi muốn tên hiển thị.

Tôi đang sử dụng để làm việc trong Flex, vì vậy kinh doanh Cursor này là khác nhau đối với tôi :)

Anyways, cho những người khác ở đây là mã của tôi:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.v(TAG, "Activity State: onCreate()"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.choose_contact); 

    // Obtain handles to UI objects 
    mAddAccountButton = (Button) findViewById(R.id.addContactButton); 
    mContactList = (ListView) findViewById(R.id.contactList); 
    mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible); 

    // Initialize class properties 
    mShowInvisible = false; 
    mShowInvisibleControl.setChecked(mShowInvisible); 
    mContactList.setOnItemClickListener(new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      addContactAt(position); 
     } 
    }); 
    mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Log.d(TAG, "mShowInvisibleControl changed: " + isChecked); 
      mShowInvisible = isChecked; 
      populateContactList(); 
     } 
    }); 

    // Populate the contact list 
    populateContactList(); 

} 

/** 
* Populate the contact list based on account currently selected in the account spinner. 
*/ 
private SimpleCursorAdapter adapter; 
private void populateContactList() { 
    // Build adapter with contact entries 
    contactsCursor = getContacts(); 
    String[] fields = new String[] { 
      ContactsContract.Data.DISPLAY_NAME 
    }; 
    adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, contactsCursor, 
      fields, new int[] {R.id.contactEntryText}); 
    mContactList.setAdapter(adapter); 
} 

/** 
* Obtains the contact list for the currently selected account. 
* 
* @return A cursor for for accessing the contact list. 
*/ 
private Cursor getContacts() 
{ 
    // Run query 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

private void addContactAt(int position) 
{ 
    contactsCursor.moveToPosition(position); 
    String name = contactsCursor.getString(
      contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
} 
} 
4

Hmm - bạn đang rối tung với con trỏ của AdapterView đằng sau lưng, có thể không phải lúc nào cũng là một ý tưởng hay. Cách khác là gọi parent.getItemAtPosition (position) bên trong trình xử lý onItemClick của bạn và truyền kết quả tới một con trỏ; nó sẽ trỏ vào hàng tương ứng với mục đã được nhấp vào.

+0

này sẽ trở lại giống hệt nhau 'Cursor' đối tượng – Vasiliy

14
@Override 
protected void onListItemClick(ListView l, View v, int position, long ida) { 
    super.onListItemClick(l, v, position, ida); 

    Cursor mycursor = (Cursor) getListView().getItemAtPosition(position); 
    showToast("mycursor.getString(1) " + mycursor.getString(1) +" "); 
+4

Tôi biết đó là trong tài liệu - [ListView] (http: //developer.android.com/reference/android/app/ListFragment.html) - nhưng tôi không thể hiểu tại sao chúng ta nên sử dụng 'getListView()' khi ListView có liên quan đã được cung cấp dưới dạng tham số. – losttime

+0

Thật vậy. Và nó có vẻ tốt cho tôi nếu tôi thay thế 'getListView()' bằng 'l'. –

4
public void onItemClick(AdapterView<?> parent, View view,int position, long id) 
{ 
Map<String, Object> map = (Map<String, Object>)_productListView.getItemAtPosition(position); 
String _productCode = (String) map.get("ProductCode"); 
String _productName = (String) map.get("ProjectName"); 
Double _price = (Double) map.get("Price"); 
} 
0

tôi đã sử dụng đoạn mã sau như đã đề cập bởi Miki Habryn

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Cursor client = (Cursor)parent.getItemAtPosition(position); 
    String client_name = client.getString(2); // third column in db 
    Toast.makeText(getBaseContext(), client_name, Toast.LENGTH_SHORT).show(); 
} 
Các vấn đề liên quan