2013-06-23 3 views
5

Может ли кто-нибудь сказать мне, как мне отображать номер телефона и имя контакта в пользовательском списке? Код наклеивается нижеОтображение контактного номера и контактного имени в пользовательском виде списка

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"); 


    } 
} 

Файл ROW.xml обычай ListView с флажком и два TextView к нему. Код извлекает данные из контактов и отображает их в LogCat. Я не могу понять, как отображать имя и номер в моем пользовательском представлении с помощью simpleCursorAdapter.

row.xml файл

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/contact_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="John Doe" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/phone_number" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/contact_name" 
     android:text="(999)999-9999" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <CheckBox 
     android:id="@+id/checkBox_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" /> 

</RelativeLayout> 

Может кто-нибудь наставит меня? Спасибо.

+0

вы хотите использовать пользовательский адаптер? У меня есть решение, которое отображает имя и номер телефона с помощью пользовательского адаптера. – Raghunandan

+0

Я могу попробовать. Нужно ли мне избавляться от simpleCursorAdapter? – user2511882

+0

wll, если вы хотите, я могу предоставить altenative solution – Raghunandan

ответ

14

Поскольку оп попросили для решения с помощью пользовательского адаптера я выложил ниже (из комментариев)

Display.java

public class Display extends Activity implements OnItemClickListener{ 

    List<String> name1 = new ArrayList<String>(); 
    List<String> phno1 = new ArrayList<String>(); 
    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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/button1" 

     android:id="@+id/lv"/> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Select" /> 

</RelativeLayout> 

Пояснение.:

Вышеупомянутый пользовательский адаптер. Пользовательский макет row.xml с 2 текстовыми полями и один флажок завышен для каждой строки. getAllContacts() получит все контакты из списка контактов и сохранит их в списке.

Пользовательский адаптер отображает элементы в настраиваемом макете, раздутом для каждой строки.

При установке флажка и нажатии на дисплее отображается тост с выбранным именем контактов.

ФОТОГРАФИЯ

enter image description here

+0

Можете ли вы объяснить, что делает ваш код. – user2511882

+0

уверен, дайте мне минутку. – Raghunandan

+0

@ user2511882 i обновил мой пост, дайте мне знать, если вам нужна дополнительная помощь – Raghunandan

0

Я думаю, вы должны позвонить cursor.moveToFirst() еще раз перед тем, как передать его SimpleCursorAdapter, так как прямо сейчас вы отправляете «готовый» курсор.

Кроме того, ваш код кажется прекрасным. Вы можете сравнить его с кодом here, который делает что-то подобное (но с пользовательской базой данных).

+0

вы можете указать, в какую строку я должен внести изменения? – user2511882

+0

Добавьте его прямо перед созданием адаптера. – Jong