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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

6067閲覧

android開発(java) トグルボタンの初期値設定で、OnCheckedChangedが呼び出されてしまう!!

kt.tk.co

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2017/06/09 12:50

編集2017/06/09 12:55

■実装したい内容

●ボタン付きのListView (トグルボタンのON/OFFはファイルから読み込み、初期値として設定する)
イメージ説明

●リスト項目の削除機能
イメージ説明

■問題点(詰まっている箇所)

リストの項目を削除すると、全てのON/OFFボタンが勝手に実行されてしまう。

Androidの ViewHolder を使用して実装を行っています。
ボタンの状態をViewHolderに保存してしまうと削除などの更新を行った後に画面に反映されないため、ボタンの状態(ON/OFF)の設定は下記の処理をViewHolderの外で行っています。
(正しい場所に設定できているか不安です)

Java

1holder.toggleButton.setChecked(Array.get(position).getOnOff()); 2//Arrayリストに保存してあるposition番目の項目のOn/Off状態をtrueまたはfalseで取得し、 3//holder.toggleButton.setChecked()で初期値として設定する処理です。

この時、リスト項目は問題なく削除された結果が画面に反映されています。
ただし、トグルボタンに変更があった場合に呼び出される以下の処理

Java

1public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 2 //処理 3}

が呼び出されてしまい、全てのボタンが変更(実行)されてしまいます。

リスト項目を削除した結果を画面に反映させつつ、ON/OFFの状態を正しく表示させたいです。

onCheckedChanged が呼び出されないように、ボタンのON/OFFの初期値を設定できる方法などがあればいいのですが・・・

恐らく、アルゴリズムを正しく組めていれば実装できるものだと思いますが、どのように記述すればよいのか分からずお手上げ状態です。

ご教授頂けますと幸いです。

以下、処理部分のコードをまとめました。

Java

1 public View getView(final int position, View convertView, ViewGroup parent) { 2 ViewHolder holder; 3 // 最初だけ View を inflate して、それを再利用する 4 if (convertView == null) { 5 // activity_main.xml に list.xml を inflate して convertView とする 6 convertView = inflater.inflate(itemLayoutId, parent, false); 7 // ViewHolder を生成 (リストが更新されても変更されない) 8 holder = new ViewHolder(); 9 holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 10 holder.toggleButton = (ToggleButton) convertView.findViewById(R.id.toggleButton); 11 12 13 // ボタンが変更された時の処理を設定 14 holder.toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 15 // トグルボタンがクリックされたと時のハンドラ 16 @Override 17 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 18 19 // トグルボタンの状態が変更された時の処理を記述 20 if(isChecked) { 21 22 //ONになった時の処理 23 Array.get(position).setOnOff(true); 24 25 //Arrayリストの内容をファイルに出力する処理★ 26 27 } 28 else { 29 30 //OFFになった時の処理 31 Array.get(position).setOnOff(false); 32 33 //Arrayリストの内容をファイルに出力する処理★ 34 } 35 36 } 37 }); 38 39 convertView.setTag(holder); 40 41 } 42 // holder を使って再利用 43 else { 44 holder = (ViewHolder) convertView.getTag(); 45 } 46 47 48 49 //////////////////////////////////////////////// 50 // リストが更新されると実行される。 51 // リストが生成された時や、リストが画面外から出てきた時にも実行される。 52 //////////////////////////////////////////////// 53 54 // holder の imageView にセット 55 holder.imageView.setImageResource(Array.get(position).getImage()); 56 holder.toggleButton.setChecked(Array.get(position).getOnOff()); 57 58 return convertView; 59 }

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

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

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

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

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

guest

回答2

0

トグルボタンにView作成中かどうかを判別できるようなタグをつけるのはどうでしょう。
getViewの処理中は「作成中」状態のタグをつけ、処理が終わるときに外す、ないしは「作成完了」などの状態のタグを付けます。
そしてリスナーメソッドで引数のbuttonViewからそのタグを取り出し、「作成中」タグなら何もせず終了するようにしてみてはいかがでしょうか?

投稿2017/06/10 02:05

swordone

総合スコア20651

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

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

0

ベストアンサー

setCheckedで値を設定する前にリスナーを外し、setCheckedで値を設定した後にリスナーをつけるようにすればいいですね。

投稿2017/06/09 13:52

yona

総合スコア18155

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

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

kt.tk.co

2017/06/09 14:23

ご回答ありがとうございます! 実装してみたところ、問題なく動くことを確認致しました。 いままでリスナーは付けるだけで「外す」という発想がありませんでした! リストの画面をスクロールするたびに、リスナーを 外す→付ける とするのは処理が多くなりそうなので気に掛かるので、今後時間があるときに他の方法を探してみる事に致します。 とても早く解決策をお教え頂きありがとうございました。
yona

2017/06/09 14:30

そうですね。 ただ、匿名クラスではなくフィールド変数としてインターフェースを用意すればそんなに気にしなくてもいいと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問