web-dev-qa-db-ja.com

Androidチェックボックスの問題があるリストビュー

奇妙な問題があります!チェックボックス付きのリストビューを作成しようとしています。私の他の thread では、チェックされる行を追跡する配列を使用するように言われました。私はそれをしました、そしてそれはうまくいきましたが、論理は間違っていて、そして私は今別の問題に出くわします。

public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }

        CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);
        checkbox.setChecked(checked[position]);

        final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow);

        checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    rowLayout.setBackgroundColor(Color.GRAY);                       
                    checked[position] = false;                      
                }
                else
                {   
                    rowLayout.setBackgroundColor(Color.DKGRAY);
                    checked[position] = true;                       
                }
            }               
        });
   }

最初はすべてのチェックボックスをオフにしておくと問題なく動作しますが、下にスクロールして再度バックアップしても、選択したチェックボックスはオンのままですが、チェックされた配列が正しく設定されていません。基本的に、ifテストは逆の方法でなければなりません!

if(isChecked)
{
   rowLayout.setBackgroundColor(Color.GRAY);                        
   checked[position] = true;                        
}
else
{   
   rowLayout.setBackgroundColor(Color.DKGRAY);
   checked[position] = false;                       
}

問題はスクロールにあります。スクロールするたびにonCheckedChangedメソッドが呼び出され、行がリサイクルされるため、選択されていない新しい行の位置に渡されますが、以前に選択されたものと同じインデックスを持っているためです。値を変更します。たとえば、インデックス2のボックスをオンにして(trueに設定)、新しい行を下にスクロールすると、インデックス2の行になり、メソッドが再度呼び出され、チェックボックス(チェックされた配列のフィールド)の設定が解除されます。

チェックされているすべてのボックスを「記憶」する必要があります。つまり、チェックされた配列が適切に初期化されるようにしたいのです。また、どのボックスがチェックされているかを覚えておき、スクロールするたびに失われないようにします。

何が悪いのですか?

手伝ってくれませんか?

事前に感謝-マイク

25
mixkat

これはトリッキーでした。

問題は、setCheckedを呼び出して、古いOnCheckedChangeListenerをアクティブにすることです。

修正は非常に簡単です。setOnCheckedChangeListenerを呼び出す前にsetCheckedを呼び出します。このようにして、リサイクルされたビューから古いリスナーへのリンクを切断します。

76
Matthew Willis

CheckboxListviewの単一選択を確認するには、これをチェックします

AdpList adapter=new AdpList(this,array,false);
listview.setAdapter(adapter);

アイテムを選択すると、アイテムCLickListenerで次のように実行します

listview.setonItemClickListener(new OnItemClickListener)

ここでは、現在のアイテムの位置を取得します

array.get(Position);

チェックボックスビューを取得し、チェックボックスをクリックすると、アダプターなどでメソッドを作成します。

adapter.setList(true);
adapter.notifyDataSetChanged();

そして、アダプターで、Setlistメソッドで渡したパラメーターを確認して、条件を設定します。

if (isChecking==true)
{
checkbox1.setChecked(true);
}else{
checkBox1.setChecked(false);
}
0