getView不良行为中的项目的setOnClickListener

时间:2014-11-06 14:40:30

标签: android adapter relativelayout onclicklistener

我面临一个非常奇怪的行为,我在自定义适配器中的复选框及其标签上设置onClickListener。 问题是当我在第一个问题上检查答案时,也会检查第三个问题上的相同项目。复选框似乎是同步的,但我不明白为什么。

以下是一些需要了解的屏幕。

1rst question

3rd 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>

1 个答案:

答案 0 :(得分:2)

我怀疑这是因为视图正在重新使用。 Android会重新使用列表视图中的视图来提高性能,因为当您单击同一视图时会重复使用该视图,以显示已检查的状态。

您可以删除convertView

周围的if语句

if(convertView == null) ..

但如果您有很多物品,这将对性能产生影响。

否则你应该使用常见的viewHolder方法: http://developer.android.com/training/improving-layouts/smooth-scrolling.html

希望这有帮助。