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

리스트뷰에 심플커서어댑터로 주소록을 띄웠습니다. 체크를 하면 하단에도 같이 체크가 되는데요

0 추천
리스트뷰에 심플커서어댑터로 주소록을 띄웠습니다.(주소록정보는 지웟습니다.)
 
listactivity를 사용 하여 리스트뷰를 띄우고
 
여러명을 선택 하기 위래 체크박스를 추가 했습니다.
 
값을 가져오기 위해 체크한 부분에서 정보를 가져오는거 까진 잘 했는데요.
 
그런데 상단에 체크를 하고
 
스크롤을 내려서 보면
 
스크롤 내린곳에도 체크가 되어 있는데요
 
 
검색해보니
 
focusable=false로 하라고 해서 해봤는데 안되서요
 
이걸 따로 분리해서  감지 하는 방법이 없을까요? 

소스

@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.dining_together_adjustment3);

  // 인텐트 값 가져오기
  get_intent_value = getIntent();

  cursor = managedQuery(Phone.CONTENT_URI, new String[] { Phone._ID,
    Phone.DISPLAY_NAME, Phone.NUMBER }, null, null,
    Phone.DISPLAY_NAME + " asc");

  if (cursor.moveToFirst() == false) {
   return;
  }

  mArrayList.add(" " + cursor.getString(1) + " - " + cursor.getString(2));

  while (cursor.moveToNext()) {

   mArrayList.add(cursor.getString(1) + " - " + cursor.getString(2));

  }

  this.isCheckedConfrim = new boolean[mArrayList.size()];

  startManagingCursor(cursor);
  cols = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER };

  names = new int[] { R.id.row_tv_name, R.id.row_tv_number };
  adapter = new SimpleCursorAdapter(this,
    R.layout.contact_muit_check_list_item, cursor, cols, names);

  this.setListAdapter(adapter);

  listView = getListView();

  listView.setItemsCanFocus(false);
  listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  Button Borrow_money_the_former_button_ok = (Button) findViewById(R.id.Borrow_money_the_former_button_ok);

  Borrow_money_the_former_button_ok
    .setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {

     }
    });

 }

contact_muit_check_list_item. xml 입니다.

<?xml version="1.0"  encoding="utf-8"?>
<!-- 이 파일은 /res/layout/listview.xml이다. -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout_contact_muit_check_list_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false" >

    <CheckBox
        android:id="@+id/row_chbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:focusable="false" />

    <TextView
        android:id="@+id/row_tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/row_chbox"
        android:background="#ffffff" />

    <TextView
        android:id="@+id/gap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/row_tv_name"
        android:background="#bcbcff" />

    <TextView
        android:id="@+id/row_tv_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/gap"
        android:background="#bccbff" />

</RelativeLayout>


 

왜 체크가 상단과 스크롤후의 아래에도 같이 체크가 될까요;;;

 

setChoiceMode가 적용이 안된건지 ..

따르 각자 동작 하는 방법이 없을까요?

 

이미지는 이렇습니다. (상단에 4개를 체크하고 스크롤을 내리니 4개중 2개가 보이는겁니다.)

 

 

오로도로동 (520 포인트) 님이 2013년 5월 29일 질문
오로도로동님이 2013년 5월 30일 수정

2개의 답변

0 추천
소스를 보는데 아래 xml 덧붙여주신 파일이 위에 java 코드에서 쓰이고 있나요?

왜 제눈에만 안보이는거 같죠 -_-;;

아무튼 체크가 밑에서 딸려 올라가는건 listview 가 view 를 재활용하는 구조이기 때문입니다

재활용될때마다 세팅을 새로 해주어야 해요... getView 부분에서 해주지요..
블랙넥원 (9,600 포인트) 님이 2013년 5월 29일 답변
아. 불필요 부분을 지우다가 보니 지웠나 보네요;;
아. getview를 사용 하려면 상속해서 하면 되는거군요
ㅠㅠ 정말 감사합니다. 드디어 방향을 찾았네요ㅠㅠ
한번 해보겠습니다. ^^

ps 보여드린 xml이 소스에 있는 contact_muit_check_list_item 입니다.
0 추천
리스트 뷰는 재활용을 하지요. 그렇기에 체크하지 않을 부분은 else로 처리해 주세요. 그럼 될거에요.
chemkaaa (6,030 포인트) 님이 2013년 5월 29일 답변
말씀이 이해가 안갔는데요 체크 하지 않을 부분은 위에 분 말씀대로 getview에서 따로 처리 해야 하는건가요?
네 어댑터 부분의 getview에서 선택된것과 선택되지 않은 것을 구분해서 처리하면 될것같은데요.
아 아직도 이해가 안가서 그러는데요
그럼 스크롤을 내리기 전에는 재사용 되어 있지 않았기 때문에
구분이 가능 하시단 말씀 이신거죠?
 그럼 체크가 되었고 안되었고를  포지션 대로 araylist로 저장을 한후
스크롤이 끝나면 arraylist를 포문으로 돌려서 다시 set 해주면 되나요?

아직 확실히 이해가 되지 않아 추측성 말만 드리네요 ㅠㅠ
저도 추측성 답만 다네요 ㅋㅋ
getview를 오버라이딩해서 쓰셨다니 커스텀 아뎁터가 맞겠죠?
그 커스텀 아뎁터 클래스 안에 포지션을 담을 리스트를 만들고
getview에서 조건으로 리스트가 true일 경우에 체크를하고
flase일 경우 체크를 하지 않으면 될 거라고 예상합니다.
activity안의 클릭 이벤트를 받는 곳에다 리스트를 눌렀을 경우 아뎁터의 리스트에 true를 주면 될 것같고요.
for문은 돌릴 필요 없을 것같습니다.
...