마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

listview구현 질문입니다.

0 추천
안녕하세요

주소록 구현을 좀 하고 있는데

인터넷에 있는거 받아와서 했더니 그냥 리스트뷰만 떠서

버튼이랑 좀 넣고 싶어서 레이아웃 xml로 따로 만들어서 넣었더니 계속 오류가 떠서요

public class addPhoneActivity extends ListActivity {
 String tag = "cap";
 String [] name, new_name;
 int count = 0;
 ListView friendslist;
 ArrayAdapter<String> adapter;
 Button select;
 Button cancle;

 
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.addphonenum);

  Cursor cursor = getURI();  // 전화번호부 가져오기
  int end = cursor.getCount(); // 전화번호부의 갯수 세기
  name = new String[end];   // 전화번호부의 이름을 저장할 배열 선언
 
  friendslist = (ListView)findViewById(R.id.friendslist);
  select = (Button)findViewById(R.id.okbtn);
  cancle = (Button)findViewById(R.id.canclebtn);
 
 
  Intent intent = getIntent();
 
  String[] bbStr = cursor.getColumnNames();
  for(int i=0; i<bbStr.length;i++)
   // 각각의 컬럼 이름 확인
   Log.e(tag, "ColumnName " + i + " : " + cursor.getColumnName(i));
 
  if(cursor.moveToFirst()) {    //항상 처음에서 시작
   do {
    if(!cursor.getString(2).startsWith("01")) // 01로 시작하는 핸펀만
     continue;         // 이멜주소만 있는것은 제외
    // 요소값 얻기
    name[count] = cursor.getString(1);  //이름
    name[count] += "\n";
    name[count] += cursor.getString(2);  //전번
    count++;
   } while(cursor.moveToNext());
  
   new_name = new String[count];    //이멜주소 제외한 01번호 가져오기
   for(int i=0; i<count; i++) new_name[i] = name[i];  //복사
  }
  cursor.close(); // 반드시 커서 닫고
   
  adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, new_name);

  friendslist.setAdapter(adapter);         // 리스트뷰
  friendslist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  // 반드시 설정해줘야 멀티초이스
 
 
 
  friendslist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   
 String mes="";
    long num[] =  friendslist.getCheckItemIds();  // 현재 체크된 id들의 배열 리턴
    if(num.length>5) {        // 최대 선택가능 갯수 제한
      friendslist.setItemChecked(position, false); // 강제로 언첵
     Toast.makeText(addPhoneActivity.this,
       "5개까지만 선택이 가능합니다.",
       Toast.LENGTH_SHORT).show();
     return;
    }

    // 화면표시 - 여기서 얻어온 값들 처리하심됨
    mes = "선택된사람 : \n";
    for(int i=0; i<num.length;i++) {
     mes += i + " : " + name[(int)num[i]];
     mes +="\n";

    
    // Intent intent = new Intent();
    // String num1 = mes;
   //  intent.putExtra("TextOut", 1);
   //  setResult(RESULT_OK,intent);
     
     }
       
    Log.e(tag, mes);
    Toast.makeText(addPhoneActivity.this, mes, Toast.LENGTH_SHORT).show();
   }
  });
 }

 

    private Cursor getURI() {
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
       
        String[] projection = new String[] { // 세개만 프로젝션함
          Contacts._ID,
          ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
          ContactsContract.CommonDataKinds.Phone.NUMBER
        };
        // 정렬방식 설정
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, projection, null, null, sortOrder);
    }
}

 

이거저거 건들다보니까 조금 달라지긴했는데

 setContentView(R.layout.addphonenum);

이부분을 하면 주소록이 보여지지도 않네요 ㅜㅜ
모하지모해 (300 포인트) 님이 2013년 5월 17일 질문

1개의 답변

+1 추천
 
채택된 답변
LogCat에 어떤 오류가 나왔는지 알려주시면 답변에 도움이 될 듯 싶습니다.
두부고기 (3,820 포인트) 님이 2013년 5월 18일 답변
모하지모해님이 2013년 5월 24일 채택됨
05-21 21:32:56.106: W/dalvikvm(6144): threadid=1: thread exiting with uncaught exception (group=0x41486438)
05-21 21:32:56.106: E/AndroidRuntime(6144): FATAL EXCEPTION: main
05-21 21:32:56.106: E/AndroidRuntime(6144): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mytest.testchat/com.mytest.testchat.Suchfriends}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread.access$600(ActivityThread.java:138)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.os.Looper.loop(Looper.java:137)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread.main(ActivityThread.java:4929)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at java.lang.reflect.Method.invokeNative(Native Method)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at java.lang.reflect.Method.invoke(Method.java:511)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at dalvik.system.NativeStart.main(Native Method)
05-21 21:32:56.106: E/AndroidRuntime(6144): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ListActivity.onContentChanged(ListActivity.java:243)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:412)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.Activity.setContentView(Activity.java:2087)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at com.mytest.testchat.Suchfriends.onCreate(Suchfriends.java:33)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.Activity.performCreate(Activity.java:5238)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
05-21 21:32:56.106: E/AndroidRuntime(6144):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2045)
05-21 21:32:56.106: E/AndroidRuntime(6144):     ... 11 more

이렇게뜨네요 엑티비티 이름은 suchfriends로 바꿨구요
본 액티비티는 ListActivity를 상속받고 있군요.
ListActivity에선 기본적으로 풀 스크린의 싱글 리스트 뷰로 ListView가 정해져 있습니다.

이 기본 리스트 뷰를 접근할려면
ListView list = getListView();

으로 하셔야합니다. 왜냐하면 ListActivity에는 그 리스트 뷰에만 할당 된 기본 리스트 뷰가 있기 때문이죠.

따로  setContentView를 사용해 커스텀 리스트 뷰를 얻으실려면
그 리스트 뷰의 android:id가 무조건, 무조건 list이여야 합니다.

android:id="@+id/list" 이렇게 설정하셔야 합니다.

ListActivity의 기본 ListView의 android:id가 list이기 때문에, 커스텀 리스트 뷰의 id를 list으로 하는 것으로, 대신 사용할 수 있는 겁니다.
감사합니다 제가 아직 초보라 잘 몰라서 그러는데 그러면 리스트엑티비티로 선언한거에서는 커스텀 아답터를 따로 해서 만들어야만 버튼같은거 넣을수 있는건가요??
public class Suchfriends extends ListActivity {
 String tag = "cap";
 String [] name, new_name;
 int count = 0;
 ListView listView;
 
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Cursor cursor = getURI();  // 전화번호부 가져오기
  int end = cursor.getCount(); // 전화번호부의 갯수 세기
  name = new String[end];   // 전화번호부의 이름을 저장할 배열 선언
  
  String[] bbStr = cursor.getColumnNames();
  for(int i=0; i<bbStr.length;i++)
   // 각각의 컬럼 이름 확인
   Log.e(tag, "ColumnName " + i + " : " + cursor.getColumnName(i));
  
  if(cursor.moveToFirst()) {    //항상 처음에서 시작
   do {
    if(!cursor.getString(2).startsWith("01")) // 01로 시작하는 핸펀만
     continue;         // 이멜주소만 있는것은 제외
    // 요소값 얻기
    name[count] = cursor.getString(1);  //이름
    name[count] += "\n";
    name[count] += cursor.getString(2);  //전번
    count++;
   } while(cursor.moveToNext());
   
   new_name = new String[count];    //이멜주소 제외한 01번호 가져오기
   for(int i=0; i<count; i++) new_name[i] = name[i];  //복사
  }
  cursor.close(); // 반드시 커서 닫고
  
  
  setListAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_multiple_choice, // 멀티 쵸이스
    new_name));
  listView = getListView();         // 리스트뷰
  listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  // 반드시 설정해줘야 멀티초이스
  
  
  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    String mes="";
    long num[] = listView.getCheckItemIds();  // 현재 체크된 id들의 배열 리턴
    if(num.length>5) {        // 최대 선택가능 갯수 제한
     listView.setItemChecked(position, false); // 강제로 언첵
     Toast.makeText(Suchfriends.this,
       "5개까지만 선택이 가능합니다.",
       Toast.LENGTH_SHORT).show();
     return;
    }
    
    
    // 화면표시 - 여기서 얻어온 값들 처리하심됨
    mes = "Selected Item : \n";
    for(int i=0; i<num.length;i++) {
     mes += i + " : " + name[(int)num[i]];
     mes +="\n";
    }
    Log.e(tag, mes);
    Toast.makeText(Suchfriends.this, mes, Toast.LENGTH_SHORT).show();
   }
  });
 }
    private Cursor getURI() {
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        
        String[] projection = new String[] { // 세개만 프로젝션함
          Contacts._ID,
          ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
          ContactsContract.CommonDataKinds.Phone.NUMBER
        };
        // 정렬방식 설정
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, projection, null, null, sortOrder);
    }
}
이게 제가 건드리기전 소스 인데
전 여기서 버튼같은걸 추가하고 싶어서 xml로 레이아웃 만들어서
버튼주고 리스트넣어서 해봤는데
어떻게 해야하는지 도대체 모르겠네요..;;;
리스트 액티비티의 기본 리스트뷰는 기초적인 리스트를 담고 있습니다.

리스트 이외에 다른 뷰 원소를 넣고 싶다면 커스텀 리스트를 작성하고 등록하셔야 합니다.

그냥 쉽게 리스트액티비티에서 액티비티로 다시 바꾸신 후, setListAdapter 대신 friendslist.setAdapter 함수로 바꿔 써보도록 하세요.
오오 감사합니다 !!!!!!!
이렇게 간단한 거였다니 ..ㅜㅜ
좋은 지식 나눠주셔서 감사합니다 ㅎ!!!
...