1

私が抱えている問題は、チェックボックスをクリックしてリストビューをスクロールアップして選択したチェックボックスを変更したり、最初のチェックボックスを選択して最後のチェックボックスも選択したりする場合です。私の英語力がまだ十分でないことは承知しています。申し訳ありません。どんな助けでも感謝します。

import java.util.ArrayList;
import java.util.Hashtable;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;

public class MyListAdapter extends BaseAdapter{

     public static class ViewHolder {

         public CheckBox chkb = null;

    } 


    private LayoutInflater mInflater;

    private ArrayList<MyListAdapterItem> myListAdapterItems = null;

    private Hashtable<Object, Object> items = null;

    private boolean selectAll = false;

    private boolean readOnly = false;

    public MyListAdapter(Context context, ArrayList<MyListAdapterItem> myListAdapterItems, boolean selectAll, boolean readOnly) {

        mInflater = LayoutInflater.from(context);

        this.myListAdapterItems = myListAdapterItems;

        this.selectAll = selectAll;

        this.readOnly = readOnly;

        items = new Hashtable<Object, Object>();
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;

        if (convertView == null) {

            convertView = mInflater.inflate(R.layout.chkb_fila, null);

            viewHolder = new ViewHolder();

            viewHolder.chkb = (CheckBox) convertView.findViewById(R.id.chkbCultivo);

            convertView.setTag(viewHolder);

        }else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        items.put(myListAdapterItems.get(position), viewHolder.chkb);

        viewHolder.chkb.setText(myListAdapterItems.get(position).getDescription());

        if(selectAll){

            viewHolder.chkb.setChecked(true);
        }

        if(readOnly){

            viewHolder.chkb.setEnabled(false);

        }

        return convertView;

    }


    public int getCount() {

        return myListAdapterItems.size();

    }


    public Object getItem(int position) {

        return myListAdapterItems.get(position);

    }


    public long getItemId(int position) {

        return position;

    }

    /**
     * @return the myListItems
     */
    public ArrayList<MyListAdapterItem> getMySelectedListItems() {

        ArrayList<MyListAdapterItem> listSelectedItems = new ArrayList<MyListAdapterItem>();

        CheckBox tmpCheckBox = null;

        for(int i=0; i<items.size(); i++){

            tmpCheckBox = (CheckBox) items.get(myListAdapterItems.get(i));

            if(tmpCheckBox.isChecked()){

                listSelectedItems.add(myListAdapterItems.get(i));

            }

        }

        return listSelectedItems;

    }

}
4

3 に答える 3

0

2つのオプション。

1) ビューをリサイクルしないでください。常に新しいものを膨らませてください。これは「怠惰」ですが、アプリのエントリが多すぎない場合は、バグが発生する可能性が低くなります。

2)各ビューですべてを設定していることを確認してください。それらを再利用しているので、以前に何かを設定した場合はそのままになります。

これを変える:

if(selectAll){

        viewHolder.chkb.setChecked(true);
    }

    if(readOnly){

        viewHolder.chkb.setEnabled(false);

    }

        viewHolder.chkb.setChecked(selectAll);
        viewHolder.chkb.setEnabled(!readOnly);

if ブロックでは、ブール値の反対側を設定していません (else ブロックを使用することもできますが、それはより冗長です)。

于 2011-11-02T16:05:24.643 に答える
0

問題は、getViewメソッドがビューを再利用することです。したがって、そのメソッド内のチェックボックスの状態を必ず更新する必要があります。これは、その状態をどこかに保存する必要があることも意味します。

于 2011-11-02T15:52:45.873 に答える
0

ここにあなたが探しているリンクがいくつかあります。高度ですが、これに固執し、これをあきらめなければ、たくさんのことを学ぶことができます!!! 見てみましょう:

Android: 複数のクリック可能なボタンを持つ ListView 要素

ウィジェットがネストされた Android カスタム リスト項目

listItem の評価バーとボタン

于 2011-11-02T15:56:40.673 に答える