フラグメント(CoordinatorLayout)にListView
コントロールがあります。 ListView
の各行は、CheckBox
コントロールを含むTableLayout
です。Itemビューは削除されますが、CustomAdapterのListViewでチェックボックスがまだチェックされています
最初の行をチェックすると、フラグメントのDeleteSelection
メソッドが呼び出され、最初の行ビューが削除されます。しかし、新しい最初の行にはまだチェックされているチェックボックスがあります!
ListViewに関する項目を数十件確認しましたが、まだ項目を削除していますが、それでもわかりません...私は狂っています...助けてください。オーバーライドonViewCreated
方法で
row.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow>
<TextView
android:id="@+id/txtCourt"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center_vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp" />
<CheckBox
android:id="@+id/chkSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="5dp"/>
</TableRow>
</TableLayout>
MyFragment.java
public class MyFragment extends Fragment {
private Context mContext;
private ListView listView1;
private List<MyObject> mylist = new ArrayList<>();
、私はリストビューとアダプタを初期化します。
for(int i=1; i<5; i++) {
MyObject res = new MyObject();
res.mytextBla = "bla" + i;
this.mylist.add(res);
}
this.mAdapter = new CustomAdapter(this.mylist, getActivity().getApplicationContext());
this.listview1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
this.listview1.setAdapter(mAdapter);
そしてさらに少し:
public void DeleteSelection() {
SparseBooleanArray arr = mAdapter.getSelectedIds();
for(int i = (arr .size()-1); i >=0; i--) {
if (arr.valueAt(i)) {
MyObject res = mAdapter.getItem(arr.keyAt(i));
this.mylist.remove(res);
}
}
mAdapter.removeSelection();
}
CustomAdapter.java
public class CustomAdapter extends ArrayAdapter<MyObject> {
private SparseBooleanArray mSelectedItemsIds;
private List<MyObject> mylist;
private Context mContext;
public mylistAdapter(List<MyObject> mylist, Context context) {
super(context, R.layout.row, mylist);
this.mylist = mylist;
this.mContext=context;
mSelectedItemsIds = new SparseBooleanArray();
}
public void toggleSelection(int position) {
selectView(position, !mSelectedItemsIds.get(position));
}
@Override
public void remove(MyObject object) {
this.mylist.remove(object);
notifyDataSetChanged();
}
public void removeSelection() {
mSelectedItemsIds.clear(); // = new SparseBooleanArray();
notifyDataSetChanged();
}
public void selectView(int position, boolean value) {
if (value)
mSelectedItemsIds.put(position, value);
else
mSelectedItemsIds.delete(position);
notifyDataSetChanged();
}
public SparseBooleanArray getSelectedIds() {
return mSelectedItemsIds;
}
public void refresh(ArrayList<MyObject> mylist) {
this.mylist = mylist;
this.clear();
this.addAll(mylist);
this.notifyDataSetChanged();
}
// View lookup cache
private static class ViewHolder {
CheckBox chkSelect;
TextView txtBla;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Get the data item for this position
MyObject dataModel = getItem(position);
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row, null); //parent, false);
viewHolder.txtBla = convertView.findViewById(R.id.txtBla);
viewHolder.chkSelect = convertView.findViewById(R.id.chkSelect);
viewHolder.chkSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
toggleSelection(position);
}
});
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
viewHolder.txtBla.setText(dataModel.mytextBla);
// Return the completed view to render on screen
return convertView;
}
}
ありがとうございました!
sooooooo多くありがとう! – kevinob