質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

3080閲覧

スクロールしてもチェックボックスの値が消えないでほしい。

takuyaaa

総合スコア5

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/08/22 07:37

現状

scrollViewにRecyclerViewを置き、RecyclerViewにはcheckBoxが配置されています。
アプリを起動し、複数行表示後、1行目にチェックを入れ、
上下にスクロールすると、チェックが消えてしまいます。
動作を見る限り、チェックを入れたcheckBoxが画面外まで移動すると消えてしまいます。

実現したいこと

スクロールしてもチェックボックスの値が消えないでほしい。

色々調べたのですが、わからなかった教えて下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

アダプタが返す View に含まれる CheckBox 等は, 画面に表示している間のみその状態が有効です.

行の表示が必要になると onBindViewHolder が呼ばれ, その後 View がそのまま表示されます.
もし onBindViewHolder で設定していなければ, CheckBox 等はデフォルト状態で表示されることになります. (正確には, View は使いまわされるため, 他の行での表示がそのまま使われることになります.)
ですので, onBindViewHolder の度に保存してあるデータから設定し, また変更されたら保存するようにしなければ, 常に(再)表示時はデフォルトで表示されることになります.

投稿2019/08/22 09:23

編集2019/08/22 09:31
jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

解答をして頂いた「jimbe様」、「azuapricot様」
情報ありがとうございます。
結果から言いますと、私の知識不足でした。
ごめんなさい。

対処としては、OnCheckedChangeListenerではなく、
setOnClickListenerに変更した所、正しく動きました。

onBindViewHolderは使っていました。
ですが、CheckBoxの変更イベント処理をOnCheckedChangeListenerで
行っていたのが原因でした。
スクロールして画面から見切れた際に、
OnCheckedChangeListenerが動き、ステータスがFalseになり、
Holderが更新されていました。

ちゃんとデバッグすればよかったです。
すみません。

ご協力くださり、ありがとうございました!!

投稿2019/09/05 03:57

takuyaaa

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/09/05 04:26

なるほど, そのような状態だったのですね. 「スクロールして画面から見切れた際に、OnCheckedChangeListenerが動き、 ステータスがFalseになり…」というのは次のようなことだったのでしょうか。 回答しました通り, View は使い回され, その際に自動的には初期化されません. リスナもそのままです. 最後に表示していた状態のまま onBindViewHolder に渡されます. その状態で onBindViewHolder で CheckBox に対し新しい行の値を設定しますと, その瞬間に(残っていた古い)リスナが働き, 最後に表示していた行の CheckBox のデータが書き変わってしまう… ともあれ, 解決おめでとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問