前提
AndroidStudio[Java]で在庫管理アプリを作っています。
詰まったところがありますので質問させてください。
実現したいこと
- チェックボックスの状態を引き継ぐ
発生している問題・エラーメッセージ
- ListViewの最初のアイテムだけCheckBoxにチェックをしてもデータ追加の際に戻ってしまう
該当のソースコード
Java
1package com.example.zaikokanri; 2 3import android.content.Context; 4import android.graphics.Color; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.ArrayAdapter; 11import android.widget.Button; 12import android.widget.CheckBox; 13import android.widget.CompoundButton; 14import android.widget.EditText; 15import android.widget.ListView; 16import android.widget.TextView; 17 18import androidx.annotation.NonNull; 19import androidx.appcompat.app.AppCompatActivity; 20 21import java.text.DecimalFormat; 22import java.text.SimpleDateFormat; 23import java.util.ArrayList; 24import java.util.Date; 25import java.util.List; 26import java.util.Timer; 27import java.util.TimerTask; 28 29public class MainActivity extends AppCompatActivity { 30 31 List<CellData> cellDataList; 32 private int count; 33 private TextView clockText; 34 private ListView listView; 35 36 private Timer timer; 37 38 private ArrayAdapter<CellData> adapter; 39 40 @Override 41 protected void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.activity_main); 44 45 // 初期化 46 count = 0; 47 cellDataList = new ArrayList<>(); 48 adapter = new ListViewAdapter(this, R.layout.list); 49 50 // アクションバーの変更 51 getSupportActionBar().setTitle(R.string.app_name); 52 53 // Viewの取得 54 final TextView countText = findViewById(R.id.count_text); 55 final Button plusButton = findViewById(R.id.plus_button); 56 final Button minusButton = findViewById(R.id.minus_button); 57 final Button addButton = findViewById(R.id.add_button); 58 59 clockText = findViewById(R.id.clock_text); 60 listView = findViewById(R.id.list_view); 61 62 // 加算・減算 63 plusButton.setOnClickListener(new View.OnClickListener() { 64 @Override 65 public void onClick(View v) { 66 count++; 67 if (count > 9999) { 68 count = 9999; 69 } 70 countText.setText(formatThousand(count)); 71 } 72 }); 73 minusButton.setOnClickListener(new View.OnClickListener() { 74 @Override 75 public void onClick(View v) { 76 count--; 77 if (count < 0) { 78 count = 0; 79 } 80 countText.setText(formatThousand(count)); 81 } 82 }); 83 84 // リスト追加 85 addButton.setOnClickListener(new View.OnClickListener() { 86 @Override 87 public void onClick(View v) { 88 TextView time = findViewById(R.id.clock_text); 89 TextView count = findViewById(R.id.count_text); 90 EditText comment = findViewById(R.id.comment_text); 91 92 CellData cellData = new CellData(time.getText().toString(), count.getText().toString(), comment.getText().toString()); 93 cellDataList.add(cellData); 94 adapter.add(cellData); 95 listView.setAdapter(adapter); 96 } 97 }); 98 } 99 100 @Override 101 protected void onStart() { 102 super.onStart(); 103 timer = new Timer(); 104 timer.schedule(new MainTimerTask(), 0, 100); 105 } 106 107 @Override 108 protected void onStop() { 109 super.onStop(); 110 timer.cancel(); 111 } 112 113 // 3桁ごとにカンマ挿入 114 private String formatThousand(int num) { 115 DecimalFormat df = new DecimalFormat("#,###"); 116 return df.format(num); 117 } 118 119 // データを保持するクラス 120 private class CellData { 121 boolean check; 122 String time; 123 String count; 124 String comment; 125 126 CellData(String time, String count, String comment) { 127 this.check = false; 128 this.time = time; 129 this.count = count; 130 this.comment = comment; 131 } 132 } 133 134 // カスタムアダプタークラス 135 private class ListViewAdapter extends ArrayAdapter<CellData> { 136 private CellData cellDataItem; 137 private LayoutInflater inflater; 138 private int itemLayout; 139 140 ListViewAdapter(Context context, int itemLayout) { 141 super(context, itemLayout); 142 this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 143 this.itemLayout = itemLayout; 144 } 145 146 @Override 147 public @NonNull 148 View getView(final int position, View convertView, @NonNull ViewGroup parent) { 149 ViewHolder viewHolder; 150 151 if (convertView == null) { 152 convertView = inflater.inflate(itemLayout, parent, false); 153 viewHolder = new ViewHolder(); 154 viewHolder.viewCheck = convertView.findViewById(R.id.listCheckBox); 155 viewHolder.viewTime = convertView.findViewById(R.id.listTime); 156 viewHolder.viewCount = convertView.findViewById(R.id.listCount); 157 viewHolder.viewComment = convertView.findViewById(R.id.listComment); 158 convertView.setTag(viewHolder); 159 160 viewHolder.viewCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 161 @Override 162 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 163 // リストデータを変更 164 final CellData buf = cellDataList.get(position); 165 buf.check = isChecked; 166 cellDataList.set(position, buf); 167 Log.i("Test", "cellDataList["+position+"]のcheckに["+isChecked+"]を入れました"); 168 169 // 背景色を変更 170 final View parentView = (View) buttonView.getParent(); 171 changeBackgroundColor(parentView, position, isChecked); 172 } 173 }); 174 } else { 175 viewHolder = (ViewHolder) convertView.getTag(); 176 } 177 cellDataItem = getItem(position); 178 if (cellDataItem != null) { 179 viewHolder.viewCheck.setChecked(cellDataItem.check); 180 viewHolder.viewTime.setText(cellDataItem.time); 181 viewHolder.viewCount.setText(cellDataItem.count); 182 viewHolder.viewComment.setText(cellDataItem.comment); 183 } 184 185 // 背景色の変更 186 changeBackgroundColor(convertView, position, viewHolder.viewCheck.isChecked()); 187 188 return convertView; 189 } 190 191 // 色変え処理 192 private void changeBackgroundColor(View view, int position, boolean isChecked) { 193 if (position % 2 == 0) { 194 view.setBackgroundColor(Color.rgb(100, 149, 237)); 195 } else { 196 view.setBackgroundColor(Color.WHITE); 197 } 198 199 if (isChecked) { 200 view.setBackgroundColor(Color.GREEN); 201 } 202 } 203 204 // Viewを保持するクラス 205 private class ViewHolder { 206 CheckBox viewCheck; 207 TextView viewTime; 208 TextView viewCount; 209 TextView viewComment; 210 } 211 } 212 213 // Timerで呼び出すタスクのクラス 214 public class MainTimerTask extends TimerTask { 215 @Override 216 public void run() { 217 clockText.setText((new SimpleDateFormat("HH:mm:ss")).format(new Date())); 218 } 219 } 220} 221
試したこと
- Logの出力によってCellData内のcheckの状況を見る
Logcat
1 2022-10-25 03:56:35.899 20520-20520/com.example.zaikokanri I/Test: list[0]のCheckedを[true]にしたよ // チェックを押したタイミング 2 2022-10-25 03:56:42.979 20520-20520/com.example.zaikokanri I/Test: list[0]のCheckedを[true]にしたよ // 追加を押したタイミング 3 2022-10-25 03:56:43.011 20520-20520/com.example.zaikokanri I/Test: list[0]のCheckedを[false]にしたよ// 追加を押したタイミング
- なぜかCheckがtrue→falseとなってしまう
補足情報(FW/ツールのバージョンなど)
Android Studio 3.5
Build #AI-191.8026.42.35.5791312, built on August 9, 2019
JRE: 1.8.0_202-release-1483-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
画像
- 追加押下前
- 追加押下後
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。