2014-11-06 3 views
0

사용자 정의 어댑터 내에서 확인란 및 해당 레이블에 onClickListener를 설정하면 정말 이상한 동작이 발생합니다. 문제는 첫 번째 질문에 대한 답을 확인할 때 세 번째 질문에 대한 동일한 항목도 확인됩니다. 체크 박스는 동기화 된 것처럼 보이지만 이유는 알 수 없습니다.getView 내의 항목에 대해 setOnClickListener가 작동하지 않습니다.

다음은 이해해야 할 몇 가지 화면입니다. 여기

3rd question

1rst question

는 내 어댑터에서의 getView()이다 :

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View vi = convertView; 

    if(convertView == null) 
    { 
     vi = inflater.inflate(R.layout.question_item, null); 
    } 

    Qcm qcm = qcms.get(position); 
    List<Proposition> propositions = qcm.getPropositionsList(); 

    TextView numQuestion = (TextView)vi.findViewById(R.id.question_number_item); 
    TextView question = (TextView)vi.findViewById(R.id.question_text); 
    LinearLayout[] labels = new LinearLayout[5]; 
    labels[0] = (LinearLayout)vi.findViewById(R.id.question_label1); 
    labels[1] = (LinearLayout)vi.findViewById(R.id.question_label2); 
    labels[2] = (LinearLayout)vi.findViewById(R.id.question_label3); 
    labels[3] = (LinearLayout)vi.findViewById(R.id.question_label4); 
    labels[4] = (LinearLayout)vi.findViewById(R.id.question_label5); 

    final CheckBox[] checkBoxes = new CheckBox[5]; 
    checkBoxes[0] = (CheckBox)vi.findViewById(R.id.question_check1); 
    checkBoxes[1] = (CheckBox)vi.findViewById(R.id.question_check2); 
    checkBoxes[2] = (CheckBox)vi.findViewById(R.id.question_check3); 
    checkBoxes[3] = (CheckBox)vi.findViewById(R.id.question_check4); 
    checkBoxes[4] = (CheckBox)vi.findViewById(R.id.question_check5); 

    numQuestion.setText(String.valueOf(position+1)); 
    question.setText(Html.fromHtml(qcm.getQuestion())); 

    for(int i=0; i<5; i++) 
    { 
     final int cpt = i; 


     checkBoxes[i].setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Checked[i] -> !Checked[i] 
       QcmListAdapter.this.checked[position][cpt] = !QcmListAdapter.this.checked[position][cpt]; 
       APIHelper.log('d', "position="+position); 
       // TODO : Faire la methode PlaySerieFragment.saveSession(); 
       //QcmListAdapter.this.activity.getFragmentManager().getFragment(QcmListAdapter.this.); 
      } 
     }); 


     labels[i].setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       checkBoxes[cpt].performClick(); 
       APIHelper.log('d', "onClick:cpt="+cpt); 
      } 
     }); 

     Proposition p = propositions.get(i); 
     p.setFormattedView(this.activity, labels[i], (i + 1)); 

    } 

    return vi; 

} 

여기에 항목에 대한보기이다 :이 의심

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/question_block" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:padding="10dp"> 

<RelativeLayout android:id="@+id/question" android:layout_width="match_parent" android:layout_height="wrap_content"> 
    <TextView 
      android:id="@+id/question_number_item" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_marginRight="10dp" 
      android:text="X" 
      android:textSize="30sp" 
      android:textColor="@android:color/white" 
      android:gravity="center" 
      android:background="@drawable/question_number" /> 

    <TextView 
      android:id="@+id/question_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingTop="5dp" 
      android:text="Question 1 : Texte descriptif de la question tellement long" 
      android:textSize="16sp" 
      android:textColor="@color/MPQ_blue" 
      android:layout_toRightOf="@id/question_number_item"/> 
</RelativeLayout> 

<RelativeLayout android:id="@+id/question_item1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/question" android:layout_marginTop="16dp"> 

    <CheckBox android:id="@+id/question_check1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:button="@drawable/play_qcm_checkbox" android:text="" android:paddingTop="13dp"/> 
    <LinearLayout android:orientation="vertical" android:id="@+id/question_label1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/question_check1"></LinearLayout> 

</RelativeLayout> 
<RelativeLayout android:id="@+id/question_item2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/question_item1" android:layout_marginTop="8dp"> 

    <CheckBox android:id="@+id/question_check2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:button="@drawable/play_qcm_checkbox" android:text="" android:paddingTop="13dp"/> 
    <LinearLayout android:orientation="vertical" android:id="@+id/question_label2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/question_check2"></LinearLayout> 

</RelativeLayout> 
<RelativeLayout android:id="@+id/question_item3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/question_item2" android:layout_marginTop="8dp"> 

    <CheckBox android:id="@+id/question_check3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:button="@drawable/play_qcm_checkbox" android:text="" android:paddingTop="13dp"/> 
    <LinearLayout android:orientation="vertical" android:id="@+id/question_label3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/question_check3"></LinearLayout> 

</RelativeLayout> 
<RelativeLayout android:id="@+id/question_item4" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/question_item3" android:layout_marginTop="8dp"> 

    <CheckBox android:id="@+id/question_check4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:button="@drawable/play_qcm_checkbox" android:text="" android:paddingTop="13dp"/> 
    <LinearLayout android:orientation="vertical" android:id="@+id/question_label4" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/question_check4"></LinearLayout> 

</RelativeLayout> 
<RelativeLayout android:id="@+id/question_item5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/question_item4" android:layout_marginTop="8dp"> 

    <CheckBox android:id="@+id/question_check5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="start" android:button="@drawable/play_qcm_checkbox" android:text="" android:paddingTop="13dp"/> 
    <LinearLayout android:orientation="vertical" android:id="@+id/question_label5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/question_check5"></LinearLayout> 

</RelativeLayout> 

</RelativeLayout> 

답변

2

보기가 다시 사용되기 때문입니다. 안드로이드는 같은 뷰를 클릭했을 때 뷰가 재사용되므로 체크 된 상태를 표시하기 때문에 성능을 위해리스트 뷰에서 뷰를 재사용합니다.

당신은

convertView

주위에 if 문을 제거 할 수 있습니다 (convertView == null이) ..

하지만 항목이 많은 경우이 성능에 determental 될 경우. 이 도움이 http://developer.android.com/training/improving-layouts/smooth-scrolling.html

희망 :

그렇지 않으면 당신은 일반적인 viewHolder 방법을 사용해야합니다.

+0

재미있는 사실, 나는 그것이이 방법으로 재사용되었다고 생각하지 않았다. getView()에서 발생한 모든 장면을 강제로 재생성하는 방법이 있습니까? convertView가 null이기 때문에 if 문을 삭제하면 오류가 발생합니다. –

+1

죄송합니다, 잘못된 설명에 대한 제 잘못입니다. if는 제거하지만 내용은 삭제하지 않습니다. 그래서이 라인을 원한다 : vi = inflater.inflate (R.layout.question_item, null); – James

+0

이것은 내가 처음 생각한 것입니다. 그러나 이것은 스크롤 할 때마다 뷰를 다시 생성합니다. 생성 된 각 뷰의 체크 박스 상태는 지속되지 않습니다. –

관련 문제