###前提・実現したいこと
現在ListViewで一覧を表示しているのですが、項目のLongClickからチェックボックスが表示され、複数選択出来るようなものを作りたいと思っています。
実装は
ListVIew#setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
で長押しから複数選択モードに切り替え、実際に何件を選択済みというふうに実装できました。
###発生している問題・エラーメッセージ
しかし、ListView#setMultiChoiceModeListenerの
onItemCheckedStateChanged内にCheckBox#setCheckedメソッドを用いてチェックをしているのですが、実際のチェックボックスにチェックが付きません。
CheckBoxのインスタンス内のmChecked?は正しくFalseからTrueに変わっているのは確認出来たのですが、表示だけが変わらないようなのです。
CheckedTextViewも試しましたが同じ状態でした。
###該当のソースコード
xml
1 <CheckBox 2 android:id="@+id/chk_selected" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:clickable="false" 6 android:focusable="false" />
java
1 Fragment内 2 3 @Override 4 public void onActivityCreated(@Nullable Bundle savedInstanceState) { 5 super.onActivityCreated(savedInstanceState); 6 7 //...省略 8 lvContacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); 9 lvContacts.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 10 11 //...省略 12 @Override 13 public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 14 CheckBox test = (CheckBox)lvContacts.getAdapter().getView(position, null, lvContacts).findViewById(R.id.chk_selected); 15 test.setChecked(checked); 16 int count = lvContacts.getCheckedItemCount(); 17 mode.setTitle(String.format("%d 件選択中", count)); 18 } 19 } 20 }
java
1Adapter内 2 @Override 3 public View getView(int position, View convertView, ViewGroup parent) { 4 convertView = layoutInflater.inflate(R.layout.list_item,parent,false); 5 6 ((TextView)convertView.findViewById(R.id.tv_title)).setText(memoList.get(position).getTitle()); 7 CheckBox cb = ((CheckBox)convertView.findViewById(R.id.chk_selected)); 8 9 return convertView; 10 } 11
###追記(2017/06/15 20:53)
ViewHolderを実装しても駄目だったのですが、チェックボックスの値を別に保持する必要があるとの記事を他に見たので、試しにそのような実装をAdapter#getViewのほうに追記した所チェックが反映されるようになりました。ただ、この記述方法がはたして正しいのか分からないので、これで正しいか、他に正しいor綺麗な記述方法があれば引き続きご回答よろしくお願いします。
java
1Adapter内 2 3 @Override 4 public View getView(final int position, View convertView, ViewGroup parent) { 5 final ReviewMemo item = (ReviewMemo) this.getItem(position); 6 ViewHolder holder; 7 8 if(convertView == null) { 9 convertView = layoutInflater.inflate(R.layout.list_item, parent, false); 10 holder = new ViewHolder(convertView); 11 convertView.setTag(holder); 12 checked.add(false); 13 }else{ 14 holder = (ViewHolder)convertView.getTag(); 15 } 16 holder.tvTitle.setText(item.getTitle()); 17 18 //checkedというListメンバを作り、保持するようにしました。 19 holder.chkSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 20 @Override 21 public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 22 checked.set(position, arg1); //チェックが変わるたびに 23 } 24 }); 25 holder.chkSelected.setChecked(checked.get(position)); 26 27 return convertView; 28 } 29 30 class ViewHolder{ 31 32 final TextView tvIndex; 33 final ImageView ivAvatar; 34 final TextView tvTitle; 35 final CheckBox chkSelected; 36 37 public ViewHolder(View itemView) { 38 tvIndex = (TextView) itemView.findViewById(R.id.tv_title); 39 ivAvatar = (ImageView) itemView.findViewById(R.id.iv_avatar); 40 tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 41 chkSelected = (CheckBox)itemView.findViewById(R.id.chk_selected); 42 } 43 }
###追記2(2017/06/16 14:08)
リストの数が2つ以上の場合、ActionModeが切り替わってからのチェックが2つめからのチェックが付かない事が発覚しました。
何故かsetOnCheckedChangeListenerが2回目から呼ばれていないようです。
おそらくViewの部分だと思うのですが、かなり回りくどいことをしているように思います。
リストに画像を入れない場合、ListFragment#onActivityCreated内に以下だけを書くだけでチェックボックスまわりは全て動作出来ます。
java
1 setListAdapter(new ArrayAdapter<String>( 2 getActivity(), 3 android.R.layout.simple_list_item_checked, 4 mItems));
ここにImageViewを表示させたいだけなのですが、そうなるとArrayAdapterをカスタマイズしないといけない+なぜかチェックボックスまわりが機能しなくなってしまいます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。