リストのチェックボックスが予期せずにチェックされています
-
20-09-2019 - |
質問
私は、カスタムsimpleCursorAdapter
によってバインドさリストでチェックボックスのリストを持っています。
私のカスタムsimpleCursorAdapter
では、私は私の修正を加えたnewView
とbindView
をオーバーライドしてきました。
私はMULTICHOICEを行うには何とかできました。
奇妙なことは、最初の項目のチェックボックスは、突然のすべてをチェックされて、私は私のリストから任意の項目を削除した後、あります。どのようにそれが起こるのでしょうか?どのように私はそれを解決することができますか?
私のSimpleCursorAdapter
クラスます:
public class MyListCursorAdapter extends SimpleCursorAdapter
{
private Context context;
private int layout;
public MyCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to)
{
super(context, layout, c, from, to);
this.context = context;
this.layout = layout;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(layout, parent, false);
CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
if (chkBoxBtn != null)
{
chkBoxBtn.setChecked(false);
}
return v;
}
@Override
public void bindView(View v, Context context, Cursor c)
{
--binding view to my textsview in my items
//now it's the importat part:
CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
if (chkBoxBtn != null)
{
chkBoxBtn.setId(Integer.valueOf(c.getString(c
.getColumnIndex(MyUsers.User._ID))));
chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
chkBoxBtn.setChecked(false);
}
}
//i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
static ArrayList<String> checkedItemsList = new ArrayList<String>();
private class OnItemClickListener implements OnClickListener
{
private int mPosition;
private CheckBox chkBox;
OnItemClickListener(CheckBox mChkBox, View v)
{
chkBox = mChkBox;
chkBox.setChecked(false);
}
@Override
public void onClick(View v)
{
if (chkBox.isChecked())
{
checkedItemsList.add(String.valueOf(chkBox.getId()));
}
else
{
checkedItemsList.remove(String.valueOf(chkBox.getId()));
}
}
}
}
ここでチェックボックス項目を削除ボタンを記述するListActivity
クラスからのコード部分があります
OnClickListener btListener = new OnClickListener()
{
public void onClick(View view)
{
// long[] items = listView.getCheckItemIds();
int x = 0;
Uri myUri = Uri
.parse("content://com.idan.datastorageprovider/users");
String where = "_id" + "=?";
//here i am tatking all checkboxes which ive added from the adapter class
ArrayList<String> checkedItemsList = MySimpleCursorAdapter.checkedItemsList;
for (String itemID : checkedItemsList)
{
getContentResolver()
.delete(myUri, where, new String[] { itemID});
checkedItemsList.remove(itemID);
}
}
};
解決
私はSimpleCursorAdapterがここに延長する権利クラスであることを疑うます。
「をチェック」状態は、どのような方法でデータをXMLに接続されていますか?番号?だから、独自のカスタムアダプタを必要とする!
基本的にすべてのアダプタは、指定した要素(より正確には要素の位置!)からのビューを生成する方法を実装する必要があります。これは、リストは要素を表示したい任意の時点で呼び出されます。今、それが使用するトリックは再使用以前は、それ以上の画面上で見ることができないリストビュー要素を作成することです!このように:あなたがダウンしてあなたのリストをスクロールして、要素が一番上に消えたとき、まさにこのビューオブジェクトは、次の登場のアイテムのために再利用されます。
。だから、この方法は、再使用すべきである与えられた「古い」ビューで呼び出されたとき、すべて含まれている要素は、要素データに従って設定する必要があります。チェックボックスがこのゲームの一部である場合は、チェック状態のストレージを持っている必要があります!リストの要素があるとして、以下のチェックボックスのオブジェクトが存在することになるように、チェックボックスを持ってするのに十分ではありません!
ええ - -SimpleCursorAdaptersがにある物事をシンプルに表現します。 XML(ドキュメントの状態として、画像やテキスト)データを記述する。このため、単純で、あなたがここにしなければならないすべては、新しい要素のビュー・オブジェクトを作成する方法を提供です - あなたは、AT ALL再利用プロセスを傍受されていません!これは、基本的には、既存のビューオブジェクトにデータを配置する方法を知っている - しかし、それは確認/未チェックボックスを処理する方法の知識を欠いている。
!あなたのソリューション:自分のBaseAdapter拡張子を書いて行われなければならない何:「getViewメソッド」(とのgetItem、getItemIdと同様にgetCountのようないくつかの他の方法)を実装します。それは全然難しいことではありません!
この APIのデモ BaseAdapterを使用し、ここでmExpanded
状態は、あなたのチェックボックスの状態と基本的に同じです!
グッドラック!
他のヒント
あなたは notifyDataSetChanged のときに呼び出す必要があるかもしれませんあなたは、データを修正します。
問題は、あなたがonItemClickListener内からsetCheckedを呼び出しているということはおそらくです。これを回避する一つのハックの方法は、あなたのリスナーの中からsetChecked呼び出しの前と後に次のことを行うことです。
chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);
これは、あなたが手動でsetCheckedを呼ぶときに呼び出さ取得からあなたonItemClickListenerを防ぐことができます。