2017-12-13 6 views
0

フラグメント(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; 
    } 
} 

ありがとうございました!

答えて

0

アダプターのgetView()メソッドは、実際にはチェックボックスのチェック状態を実際に設定しません。ビューを再利用するたびに、チェックされた状態を正しく設定する必要があります。何かのように

viewHolder.ckhSelect.setChecked(mSelectedItemIds.get(position)); 

あなたのOnCheckedChangeListener()がトリガーされることに注意してください。 1つの簡単な回避策は、リスナーをnullに設定し、チェックボックスのチェック状態を変更した後にそれを実際の値に再設定することですが、他の(より洗練された)アプローチもあります。

+0

sooooooo多くありがとう! – kevinob

関連する問題