2013-03-20 3 views
0

나는 지역 DB에서 연락처 세부 정보를 가져 오기위한 코드를 다음과연락처에서 동적으로 채워지는 Custom ListView에서 두 번째 행을 만드는 방법은 무엇입니까?

public class Rabtaye extends Activity { 

    ListView msgList; 
    ArrayList<MessageDetails> details; 
    AdapterView.AdapterContextMenuInfo info; 

    Cursor cursor; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_main); 

     msgList = (ListView) findViewById(R.id.MessageList); 
     details = new ArrayList<MessageDetails>(); 

     MessageDetails Detail = new MessageDetails(); 

     // String info[] = { Phone.DISPLAY_NAME, Phone.NUMBER, Phone._ID }; 
     String number = null; 
     String name = null; 
     try { 

      Cursor cursor = getContentResolver().query(
        ContactsContract.Contacts.CONTENT_URI, null, null, null, 
        null); 
      while (cursor.moveToNext()) { 
       String contactId = cursor.getString(cursor 
         .getColumnIndex(ContactsContract.Contacts._ID)); 
       String hasPhone = cursor 
         .getString(cursor 
           .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
       if (hasPhone.equals("1")) { 
        // You know it has a number so now query it like this 
        Cursor phones = getContentResolver().query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
          null, 
          ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
            + " = " + contactId, null, null); 
        while (phones.moveToNext()) { 
         number = phones 
           .getString(phones 
             .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         name = phones 
           .getString(phones 
             .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
         System.out.println(number); 

        } 
        Detail.setName(name); 
        Detail.setNumber(number); 
        details.add(Detail); 
        msgList.setAdapter(new CustomAdapter(details, this)); 
        phones.close(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 




     // Detail.setName(name); 
     // Detail.setNumber(number); 
     // details.add(Detail); 

     msgList.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       TextView s = (TextView) arg1.findViewById(R.id.name); 
       String abc = s.getText().toString(); 
       Toast.makeText(Rabtaye.this, abc, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 
} 

CustomAdapter가 ListAdapter에 전달되는 사용자의 ListView에 이름과 번호를 할당했다. while 루프 내에서 Name과 Number를 추가하려고했지만 ListView에 하나의 이름과 숫자 만 채워질 때마다 시도했습니다. 나는 이것에 대해 거의 혼동하지 않는다. 친절하게 도와주세요!

답변

1

커서를 ListView에 바인딩하는 방법이 아닙니다. 일반적으로 두 개 이상의 커서 열에서 하나의 UI 필드를 생성해야하거나 필드에 바인딩하기 전에 열 데이터를 처리해야하는 경우 사용자 지정 ListView 만 있으면됩니다.

CursorAdapter는 커서를 ListView에 바인딩하지만 ListView에서 각 항목이나 항목의 형식을 정의하는 "항목 레이아웃"도 지정해야합니다. Cursor의 각 행에 대해 CursorAdapter는 Cursor에서 원하는 열을 항목 레이아웃에있는 필드로 바인딩합니다. 항목 레이아웃은 UI 화면의 두 줄 이상을 차지할 수 있습니다. 그렇게 정의하면됩니다.

전화 번호가있는 각 연락처의 연락처 이름과 전화 번호를 표시하는 것으로 생각합니다. 이를 수행하는 가장 좋은 방법은 커서가있는 데이터를 필터링하는 대신 커서의 내용을 제한하는 것입니다.

하나의 연락처에 둘 이상의 전화 번호가있을 수 있다는 점이 다릅니다. 인 경우 프로그래밍 방식으로 부모보기에 전화 번호보기를 추가하는 어댑터이 필요할 수 있습니다. 이렇게하면 모든 전화 번호와 함께 이름을 한 번 표시 할 수 있습니다.

+0

anwsering 주셔서 감사 합니다만, 나는 당신이 말하는 것을 조금 혼란스럽게 생각합니다. 어떻게 완료했는지 보여 주시겠습니까? 감사. –