2010-10-07 21 views
5

में चयनित आइटम से पठनीय डेटा कैसे प्राप्त करें मेरे पास एक सूची है जो मुझे एंड्रॉइड ContactManager नमूना से प्राप्त संपर्कों का दृश्य है। यह सूची ठीक दिख रही है, लेकिन मैं यह नहीं समझ सकता कि चयनित आइटम, जैसे "नाम" और "फोन नंबर" से जानकारी कैसे प्राप्त करें।getItemAtPosition() ListView

मैं चयनित स्थिति प्राप्त कर सकता हूं, लेकिन mContactList.getItemAtPosition (स्थिति) का परिणाम एक ContentResolver $ CursorWrapperInner है और यह वास्तव में मुझे कोई समझ नहीं आता है। मुझे उस से सिर या पूंछ नहीं मिल सकते हैं।

कोई भी जानता है कि मैं सूची में चयनित आइटम से नाम/आईडी/फोन नंबर कैसे प्राप्त कर सकता हूं?

मेरा कोड यहां है।

@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); 
} 

} `

उत्तर

5

बूम! मैं यह पता लगा। मूल रूप से आपको क्लिक ईवेंट से स्थिति संख्या मिलती है, फिर मेरे addContatAt() में आप उस स्थिति का उपयोग उस क्षेत्र के लिए कर्सर के भीतर खोजने के लिए करते हैं, जिसे आप चाहते हैं। मेरे मामले में मैं प्रदर्शन नाम चाहता था।

मैं फ्लेक्स में काम करने के लिए इस्तेमाल किया कर रहा हूँ, तो यह कर्सर व्यापार

फिर भी मुझे :) के लिए अलग है, दूसरों को यहाँ के लिए मेरे कोड है:

@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

हम्म - आप खिलवाड़ कर रहे हैं अपने एडाप्टर व्यू के कर्सर के पीछे पीछे, जो हमेशा एक अच्छा विचार नहीं हो सकता है। वैकल्पिक है अपने माता-पिता के अंदर parent.getItemAtPosition (स्थिति) को कॉल करना हैडलर क्लिक करें और परिणाम को कर्सर में डालें; यह उस आइटम से संबंधित पंक्ति पर इंगित करेगा जिस पर क्लिक किया गया था।

+0

यह वापस आ जाएगी निम्नलिखित कोड का इस्तेमाल किया ठीक उसी 'Cursor' आपत्ति – 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

मैं जानता हूँ कि यह दस्तावेज में है - [ListView] (http: //developer.android.com/reference/android/app/ListFragment.html) - लेकिन मुझे समझ में नहीं आ रहा है कि क्यों हमें प्रासंगिक getView पैरामीटर के रूप में प्रदान किया गया है, तो हमें 'getListView()' का उपयोग क्यों करना चाहिए। वास्तव में – losttime

+0

। और अगर मैं 'lL' के साथ 'getListView() 'को प्रतिस्थापित करता हूं तो यह मेरे लिए ठीक काम करता प्रतीत होता है। –

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

मैं के रूप में मिकी 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(); 
}