質問編集履歴

2

編集

2017/06/16 05:18

投稿

hiro094
hiro094

スコア26

test CHANGED
File without changes
test CHANGED
@@ -221,3 +221,35 @@
221
221
  }
222
222
 
223
223
  ```
224
+
225
+
226
+
227
+ ###追記2(2017/06/16 14:08)
228
+
229
+ リストの数が2つ以上の場合、ActionModeが切り替わってからのチェックが2つめからのチェックが付かない事が発覚しました。
230
+
231
+ 何故かsetOnCheckedChangeListenerが2回目から呼ばれていないようです。
232
+
233
+ おそらくViewの部分だと思うのですが、かなり回りくどいことをしているように思います。
234
+
235
+
236
+
237
+
238
+
239
+ リストに画像を入れない場合、ListFragment#onActivityCreated内に以下だけを書くだけでチェックボックスまわりは全て動作出来ます。
240
+
241
+ ```java
242
+
243
+ setListAdapter(new ArrayAdapter<String>(
244
+
245
+ getActivity(),
246
+
247
+ android.R.layout.simple_list_item_checked,
248
+
249
+ mItems));
250
+
251
+ ```
252
+
253
+
254
+
255
+ ここにImageViewを表示させたいだけなのですが、そうなるとArrayAdapterをカスタマイズしないといけない+なぜかチェックボックスまわりが機能しなくなってしまいます。

1

追記

2017/06/16 05:18

投稿

hiro094
hiro094

スコア26

test CHANGED
File without changes
test CHANGED
@@ -119,3 +119,105 @@
119
119
 
120
120
 
121
121
  ```
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+ ###追記(2017/06/15 20:53)
130
+
131
+ ViewHolderを実装しても駄目だったのですが、チェックボックスの値を別に保持する必要があるとの記事を他に見たので、試しにそのような実装をAdapter#getViewのほうに追記した所チェックが反映されるようになりました。ただ、この記述方法がはたして正しいのか分からないので、これで正しいか、他に正しいor綺麗な記述方法があれば引き続きご回答よろしくお願いします。
132
+
133
+
134
+
135
+ ```java
136
+
137
+ Adapter内
138
+
139
+
140
+
141
+ @Override
142
+
143
+ public View getView(final int position, View convertView, ViewGroup parent) {
144
+
145
+ final ReviewMemo item = (ReviewMemo) this.getItem(position);
146
+
147
+ ViewHolder holder;
148
+
149
+
150
+
151
+ if(convertView == null) {
152
+
153
+ convertView = layoutInflater.inflate(R.layout.list_item, parent, false);
154
+
155
+ holder = new ViewHolder(convertView);
156
+
157
+ convertView.setTag(holder);
158
+
159
+ checked.add(false);
160
+
161
+ }else{
162
+
163
+ holder = (ViewHolder)convertView.getTag();
164
+
165
+ }
166
+
167
+ holder.tvTitle.setText(item.getTitle());
168
+
169
+
170
+
171
+ //checkedというListメンバを作り、保持するようにしました。
172
+
173
+ holder.chkSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
174
+
175
+ @Override
176
+
177
+ public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
178
+
179
+ checked.set(position, arg1); //チェックが変わるたびに
180
+
181
+ }
182
+
183
+ });
184
+
185
+ holder.chkSelected.setChecked(checked.get(position));
186
+
187
+
188
+
189
+ return convertView;
190
+
191
+ }
192
+
193
+
194
+
195
+ class ViewHolder{
196
+
197
+
198
+
199
+ final TextView tvIndex;
200
+
201
+ final ImageView ivAvatar;
202
+
203
+ final TextView tvTitle;
204
+
205
+ final CheckBox chkSelected;
206
+
207
+
208
+
209
+ public ViewHolder(View itemView) {
210
+
211
+ tvIndex = (TextView) itemView.findViewById(R.id.tv_title);
212
+
213
+ ivAvatar = (ImageView) itemView.findViewById(R.id.iv_avatar);
214
+
215
+ tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
216
+
217
+ chkSelected = (CheckBox)itemView.findViewById(R.id.chk_selected);
218
+
219
+ }
220
+
221
+ }
222
+
223
+ ```