2012-01-03 7 views
2

연락처 북에서 모든 연락처를 가져와 표시해야하는 응용 프로그램에서 작업하고 있습니다. 사용자가 일부 연락처를 선택하고 db에 저장된 그룹에 추가하길 원합니다.배열 목록에서 사용자 지정 ArrayAdapter로 데이터를 표시 할 수 없습니다.

난 사용자 지정 목록을 만든

보기 - contactitem.xml-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 


android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal"> 


<TextView 

    android:id="@+id/contactname" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:layout_weight="1" 
    android:layout_marginLeft="20dp" 
    android:ellipsize="end"   
    android:singleLine="true" 
    android:clickable="true"/> 

<TextView 
    android:id="@+id/contactnum" 
    android:layout_width="wrap_content" 
    android:textColor="@color/White" 
    android:clickable="true" 
    android:layout_gravity="center_vertical" 
    android:layout_height="wrap_content"/> 

    <Button 
    android:id="@+id/add" 
    android:layout_width="wrap_content" 
    android:layout_height="35dp" 
    android:text="@string/add_contacts" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

</LinearLayout> 

내가 연락에서 연락처를 가져 오는을위한 SelectContact 클래스

public class SelectContacts extends Activity implements OnClickListener{ 

    private String groupName; 
    private Button back; 
    private Button home; 
    private List<Contact> list = new ArrayList<Contact>(); 

    private ListView contactList; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.selectcontacts); 

      Bundle bundle = getIntent().getExtras(); 
      groupName=bundle.getString("groupName"); 

      back=(Button)findViewById(R.id.back_button); 
      back.setOnClickListener(this); 

      home=(Button)findViewById(R.id.home_button); 
      home.setOnClickListener(this); 

      contactList=(ListView)findViewById(R.id.contactsListView); 

      ContentResolver cr = getContentResolver(); 



      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

      cur.moveToFirst(); 

      if (cur.getCount() > 0) { 

       do{ 

        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 

        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

        String[] fields={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};  

        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, fields, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 

        pCur.moveToFirst(); 

        do { 

         String number=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         Contact c=new Contact(name,number); 

         list.add(c); 

         }while (pCur.moveToNext()); 

         pCur.close(); 
        }    



        }while (cur.moveToNext()); 

       ContactAdapter contactAdapter=new ContactAdapter(this, R.layout.contactitem, list, contactList,groupName); 



       contactList.setAdapter(contactAdapter); 


      } 


     } 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent= new Intent(); 

      if(v==back){ 

       Bundle bundle = new Bundle(); 
       bundle.putString("groupName", groupName); 
       intent.putExtras(bundle); 

       intent.setClass(SelectContacts.this, GroupDetails.class); 
       startActivity(intent); 

      } 
      if(v==home){ 
       intent.setClass(SelectContacts.this, Welcome.class); 
       startActivity(intent); 

      } 

     } 
} 

을 book- 및 사용자 정의를 구현 한 어댑터 - ContactAdapter- `

public class ContactAdapter extends ArrayAdapter<HashMap<String, Contact>>{ 

private ArrayList<HashMap<String, Contact>> items; 

private LayoutInflater mInflater ; 

public ContactAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Contact>> items) { 

     super(context, textViewResourceId, items); 

     this.items = items; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

      mInflater = LayoutInflater.from(getContext()); 

      ViewHolder holder; 

     if(convertView==null){ 

      convertView = mInflater.inflate(R.layout.contactitem, parent, false); 

      holder = new ViewHolder(); 

      holder.name = (TextView) convertView.findViewById(R.id.contactname); 

      holder.number = (TextView) convertView.findViewById(R.id.contactnum); 

      holder.add=(Button)convertView.findViewById(R.id.add); 

      convertView.setTag(holder); 

     } 

     else{ 

      holder=(ViewHolder)convertView.getTag(); 

     } 

     String name=items.get(position).get(""+position).getContactName(); 

     String number=items.get(position).get(""+position).getContactNum(); 

     holder.name.setText(name); 

     holder.number.setText(number); 

     return convertView; 
} 



static class ViewHolder{ 

    TextView name; 

    TextView number; 

    Button add; 

} 

}

,
here Contact is a simple POJO- 



public class Contact { 
    private String contactName; 
    private String contactNum; 

    public String getContactName() { 
     return contactName; 
    } 
    public void setContactName(String contactName) { 
     this.contactName = contactName; 
    } 

    public String getContactNum() { 
     return contactNum; 
    } 
    public void setContactNum(String contactNum) { 
     this.contactNum = contactName; 
    } 

} 

은 내가

위의 코드는 emulater에 조용하고 잘 작동합니다 .. 안드로이드에 안돼서 및 연락처 이름과 목록에 표시 할 숫자를 가져옵니다. 하지만 난 원 공급기, 그것은 다음과 같은 오류와 함께 추락있어 Gmail 계정을 가지고 전화에 코드 ..

CursorIndexOutOfBoundsException 테스트 할 때 : 0

의 크기와 인덱스 0 요청을, 나는 어떤 생각 이유가 없습니다 이 일이 일어나고 있습니다. 몇 가지 제안을하십시오 ...

답변

1

연락처 커서를 가져온 후 cur.moveToFirst();에 전화하는 걸 잊은 것 같습니다. 이 선 후,

Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

당신은이 후, 여기에 같은 일을 누락 - pCur.moveToFirst();

Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
+1

변경했지만 여전히 동일한 로그 항목을 가져 오는 중 ... : ( –

+0

오류가 발생하면 logcat을 업데이트하십시오. –

+0

다른 커서에서도 같은 것을 누락했습니다. 편집 된 답변을 확인하십시오. –

1

을 다음과 같은 기능을 사용하여

  • cur.moveToFirst();
  • pCur.moveToFirst();
+0

작동했습니다 .. 선생님 .. 고마워요.하지만 여전히 활동중인 연락처를 표시 할 수 없습니다 .. 내 어댑터에 문제가있을 수 있습니다 ... –

관련 문제