0

ListView 内のチェックボックスをタップすると、リストの 2 番目の項目もチェックされます。例として、1 番目の項目をチェックすると、リストの 7 番目の項目がチェックされます。セルのレイアウトのコードは次のとおりです。

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

    <ImageView 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:id="@+id/imgDisclosureIndicator" 
        android:src="@drawable/disclosureon" 
        android:layout_alignParentTop="true" 
        android:layout_alignParentRight="true" 
        android:paddingRight="6dp"></ImageView>

    <ImageView
        android:id="@+id/imgTaskState"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/taskok" />

    <CheckBox
        android:id="@+id/chkTaskImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imgTaskState"
        android:layout_toLeftOf="@+id/imgDisclosureIndicator"
        android:layout_toRightOf="@+id/imgTaskState"
        android:focusable="false" />

</RelativeLayout>

私はあなたを助けるために画像に参加しました:

チェックボックスの問題

ちなみに、ListView は ListFragment 内にあります。

編集:以下は、セルをそのデータにマップするコードです。

String[] from = {"taskId", "taskStateId", "taskText", "disclosureIndicatorId"};
                    int[] to = {0, R.id.imgTaskState, R.id.chkTaskImage, R.id.imgDisclosureIndicator};
SimpleAdapter adapter = new SimpleAdapter(mContext, mList, R.layout.task_cell, from, to);
setListAdapter(adapter);

編集 #2: ListView が垂直に表示されている場合、この状況は発生しません。

リストビューの問題

編集 #3: SimpleAdapter を使用している場合でも、次のコードで ListView が水平の場合、同じエラーが発生します。

private class CellInspectionAdapter extends BaseAdapter
    {
            private Vector<InspectionCell> cells;
            private Context context;

            public CellInspectionAdapter(Context context, Vector<InspectionCell> cells)
            {
                this.cells = cells;
                this.context = context;
        }

        @Override
        public int getCount()
        {
            return this.cells.size();
        }

        @Override
        public Object getItem(int position)
        {
            return null;
        }

        @Override
        public long getItemId(int position)
        {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            // Map data from the ArrayList from the adapter
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View celluleTask;

            if (convertView == null) 
            {
                celluleTask = new View(context);
                celluleTask = inflater.inflate(R.layout.laprise_task_cell, null);

                // Assign data to the cell
                ImageView imgEtat = (ImageView)celluleTask.findViewById(R.id.imgTaskState);
                imgEtat.setImageResource(cells.get(position).getStateDrawable());

                // Assign text
                CheckBox chkCell = (CheckBox)celluleTask.findViewById(R.id.chkTaskImage);
                chkCell.setText(cells.get(position).getTexte());

                // Disclosure
                ImageView imgDisclosure = (ImageView)celluleTask.findViewById(R.id.imgDisclosureIndicator);
                imgDisclosure.setImageResource(cells.get(position).getDisclosureDrawable());    
            }
            else
            {
                celluleTask = (View)convertView;
            }

            return celluleTask;
        }
    }

編集#5:これが解決策です!getViewTypeCount() および getItemViewType(int position) メソッドをオーバーライドします。これらの行を SimpleAdapter に追加しましたが、機能します。

@Override
public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}
4

1 に答える 1

1

使い方convertViewが間違っています。非 nullconvertViewは、新しいビューの作成とレイアウト作業を省くだけですconvertView、現在のアイテムと一致するようにすべての子の内容を設定する必要があります。これは、両方の行が同時に表示されるため、垂直で機能する理由も説明しています。

これを試して:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Map data from the ArrayList from the adapter
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View celluleTask = convertView;

        if (celluleTask == null) {
            celluleTask = inflater.inflate(R.layout.laprise_task_cell, null);
        }

        // Assign data to the cell ALWAYS!
        ImageView imgEtat = (ImageView)celluleTask.findViewById(R.id.imgTaskState);
        imgEtat.setImageResource(cells.get(position).getStateDrawable());

        // Assign text
        CheckBox chkCell = (CheckBox)celluleTask.findViewById(R.id.chkTaskImage);
        chkCell.setText(cells.get(position).getTexte());

        // Disclosure
        ImageView imgDisclosure = (ImageView)celluleTask.findViewById(R.id.imgDisclosureIndicator);
        imgDisclosure.setImageResource(cells.get(position).getDisclosureDrawable());    

        return celluleTask;
}

PS: また、レイアウト インフレータのフェッチをgetViewメソッドの外に移動して、何度も何度も実行する必要がないようにする必要があります。

findViewByIdPPS:何度も呼び出すのを避けるために、 View Holder Patternを見てください。

于 2012-12-03T18:54:45.813 に答える