Mostrar el número de contacto y el nombre del contacto en una vista de lista personalizada

¿Alguien puede decirme cómo debo mostrar el número de teléfono y el nombre del contacto en una vista de lista personalizada? El código está pegado a continuación

import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class AddContacts extends Activity implements OnClickListener { ListView list; Cursor cursor; SimpleCursorAdapter adapter; String phoneNumber; Button AddNumber; EditText number1; EditText number2; EditText number3; String contact1; String contact2; CheckBox checkBox; String contact_name; static final String TAG = "In AddContacts"; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); AddNumber = (Button) findViewById(R.id.AddNumbers); number1 = (EditText) findViewById(R.id.NumberField1); number2 = (EditText) findViewById(R.id.NumberField2); number3 = (EditText) findViewById(R.id.NumberField3); AddNumber.setOnClickListener(this); list = (ListView) findViewById(R.id.lists); Log.d(TAG, "onCreate"); Cursor cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); String[] nameNumberArray = new String[cursor.getCount()]; Log.d("rows", Integer.toString(cursor.getCount())); Log.d("phone", "here"); while (cursor.moveToNext()) { String phoneNumber = cursor.getString(cursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); String name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Log.i("Number + Name", phoneNumber + name); } if (cursor.getCount() > 0) { int i = 0; if (cursor.moveToFirst()) { do { phoneNumber = cursor .getString(cursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); contact_name = cursor .getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); nameNumberArray[i] = contact_name + " , " + phoneNumber; i++; } while (cursor.moveToNext()); } } final String[] FROM = { nameNumberArray[0], nameNumberArray[1] }; final int[] TO = { R.id.contact_name, R.id.phone_number, }; adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, FROM, TO); list.setAdapter(adapter); cursor.close(); } @Override public void onClick(View v) { Log.d(TAG, "onClicked method"); } } 

El archivo ROW.xml es una vista de lista personalizada con una checkbox y dos textView. El código extrae los datos de los contactos y los muestra en el LogCat. No puedo imaginar cómo mostrar el nombre y el número en mi vista personalizada usando simpleCursorAdapter.

El archivo row.xml

        

¿Alguien puede guiarme? Gracias.

    Desde que op solicité la solución usando el adaptador personalizado, publiqué el siguiente (a partir de los comentarios)

    Display.java

     public class Display extends Activity implements OnItemClickListener{ List name1 = new ArrayList(); List phno1 = new ArrayList(); MyAdapter ma ; Button select; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.display); getAllContacts(this.getContentResolver()); ListView lv= (ListView) findViewById(R.id.lv); ma = new MyAdapter(); lv.setAdapter(ma); lv.setOnItemClickListener(this); lv.setItemsCanFocus(false); lv.setTextFilterEnabled(true); // adding select = (Button) findViewById(R.id.button1); select.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { StringBuilder checkedcontacts= new StringBuilder(); System.out.println(".............."+ma.mCheckStates.size()); for(int i = 0; i < name1.size(); i++) { if(ma.mCheckStates.get(i)==true) { checkedcontacts.append(name1.get(i).toString()); checkedcontacts.append("\n"); } else { System.out.println("Not Checked......"+name1.get(i).toString()); } } Toast.makeText(Display.this, checkedcontacts,1000).show(); } }); } @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub ma.toggle(arg2); } public void getAllContacts(ContentResolver cr) { Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); while (phones.moveToNext()) { String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println(".................."+phoneNumber); name1.add(name); phno1.add(phoneNumber); } phones.close(); } class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener { private SparseBooleanArray mCheckStates; LayoutInflater mInflater; TextView tv1,tv; CheckBox cb; MyAdapter() { mCheckStates = new SparseBooleanArray(name1.size()); mInflater = (LayoutInflater)Display.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return name1.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View vi=convertView; if(convertView==null) vi = mInflater.inflate(R.layout.row, null); TextView tv= (TextView) vi.findViewById(R.id.textView1); tv1= (TextView) vi.findViewById(R.id.textView2); cb = (CheckBox) vi.findViewById(R.id.checkBox1); tv.setText("Name :"+ name1.get(position)); tv1.setText("Phone No :"+ phno1.get(position)); cb.setTag(position); cb.setChecked(mCheckStates.get(position, false)); cb.setOnCheckedChangeListener(this); return vi; } public boolean isChecked(int position) { return mCheckStates.get(position, false); } public void setChecked(int position, boolean isChecked) { mCheckStates.put(position, isChecked); System.out.println("hello..........."); notifyDataSetChanged(); } public void toggle(int position) { setChecked(position, !isChecked(position)); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub mCheckStates.put((Integer) buttonView.getTag(), isChecked); } } } 

    display.xml

         

    Explicación:

    Lo anterior usa un Adaptador personalizado. Un diseño personalizado row.xml con 2 textviews y una checkbox se infla para cada fila. getAllContacts() obtendrá todos los contactos de la lista de contactos y los almacenará en una lista.

    Custom Adapter muestra los elementos en un diseño personalizado inflado para cada fila.

    Cuando marque la checkbox y haga clic en mostrar, aparecerá un brindis con el nombre de los contactos seleccionados.

    Disparo rápido

    enter image description here

    Creo que deberías cursor.moveToFirst() llamar a cursor.moveToFirst() antes de pasarlo a SimpleCursorAdapter , ya que ahora estás enviando un cursor “terminado”.

    Además de eso, tu código parece estar bien. Puede compararlo con el código aquí , que hace algo similar (pero con una base de datos definida por el usuario).