0

各行に CheckBox、TextView、および ImageView が含まれる ListView を設定しようとしています。実装で独自のアダプターを使用しますが、下にスクロールすると、理由もなくチェックボックスがチェックされます。たとえば、最初の行 (0 の位置) のチェックボックスをチェックし、下にスクロールすると、突然 17 行の要素が表示されます。もチェックされており、最初に戻ったときにチェックボックスがチェックされていないことがあります。

次のコードを使用しました。

private class ViewHolder{
        ImageView image;
        TextView name;
        CheckBox selected;
    }

private class BrowserAdapter extends ArrayAdapter<String> {

    public BrowserAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
        super(context, resource, textViewResourceId, objects);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {     
        ViewHolder holder;

        if (convertView==null){
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.browser_list_row, parent, false);

            holder = new ViewHolder();

            holder.image = (ImageView) convertView.findViewById(R.id.browser_image);

            holder.name = (TextView) convertView.findViewById(R.id.browser_file_name);
            holder.name.setOnClickListener(ActionBar.this);

            holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected);
            holder.selected.setOnCheckedChangeListener(ActionBar.this);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();             

        }

        setViewInfo(holder.image, holder.name, holder.selected, position);

        return convertView;
    }

    private void setViewInfo(ImageView image, TextView name, CheckBox selected , int position) {

        name.setTag(position);

        selected.setTag(position);
        selected.setChecked(checkedItems[position]);

        name.setText(myList.get(position));
        File temp_file = new File( file, myList.get( position ) );

        if (temp_file.isFile())
            image.setImageResource(R.drawable.mp3file);
        else
            image.setImageResource(R.drawable.folder);
    }

}//class BroswerAdapter

引数checkedItemsは、次のコードのようにリスト内のチェックボックスの状態を保存するブール配列です:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    checkedItems[(Integer)buttonView.getTag()] = isChecked;

}

私が間違っていることを理解するのを手伝ってもらえますか?

編集: getView 関数が呼び出されるたびに (convertView を使用せずに) ビューを膨らませる素朴な方法を使用すると、すべてうまくいきます。

4

2 に答える 2

0

次の行を if ステートメントの外に移動します

 holder.name.setOnClickListener(ActionBar.this);
 holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected);
 holder.selected.setOnCheckedChangeListener(ActionBar.this);
于 2013-03-27T23:54:53.483 に答える
-1

違う:

を使用していますが、次のよう にビューでsetCheckedsetSelectedを使用する必要があります。CheckBox

selected.setChecked (checkedItems[position]);

setSelected メソッドは、 (または別の)内の の選択状態を設定します。ListViewAdapterView

編集:

をビューに設定しsetOnCheckedChangeListenerますCheckBoxsetOnCheckedChangeListener次に、が設定されたビューのタグを読み取ろうとします。これはCheckBoxです。ただし、CheckBox!のタグを設定することはありません。だから、あなたが読んだタグsetOnCheckedChangeListenerは間違っています。

次のように設定する必要があります。

holder.selected.setTag ("" + position);

...そして、 では、次のsetOnCheckedChangeListenerように読みます。

checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked;
于 2013-03-27T23:01:05.840 に答える