奇妙な問題があります!チェックボックス付きのリストビューを作成しようとしています。私の他の 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の行になり、メソッドが再度呼び出され、チェックボックス(チェックされた配列のフィールド)の設定が解除されます。
チェックされているすべてのボックスを「記憶」する必要があります。つまり、チェックされた配列が適切に初期化されるようにしたいのです。また、どのボックスがチェックされているかを覚えておき、スクロールするたびに失われないようにします。
何が悪いのですか?
手伝ってくれませんか?
事前に感謝-マイク
これはトリッキーでした。
問題は、setChecked
を呼び出して、古いOnCheckedChangeListener
をアクティブにすることです。
修正は非常に簡単です。setOnCheckedChangeListener
を呼び出す前にsetChecked
を呼び出します。このようにして、リサイクルされたビューから古いリスナーへのリンクを切断します。
Checkbox
のListview
の単一選択を確認するには、これをチェックします
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);
}