■実装したい内容
●ボタン付きの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 }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。