私はToDoリストアプリケーションを作成していますが、私はリストビューを使用しています。各項目にはチェックボックスとテキストビューがあり、独自のタスクオブジェクトを持っています。問題は、1つのボックスをチェックすると、10〜11行下の別のボックスもチェックされます。リストを上下にスクロールし続けると、チェックされたチェックボックスが広がり、まもなくそのすべてがチェックされます。私は何が間違っているのか分かりません。ヘルプは非常に高く評価されるだろう!ありがとう!ここでAndroidリストビューのチェックボックスがスクランブルされる
は私ListAdapterです:
public class TaskListAdapter extends BaseAdapter {
private ArrayList<Task> tasks;
private Context context;
private TinyDB tinyDB;
public TaskListAdapter(Context context, ArrayList<Task> tasks, TinyDB tinyDB){
this.context = context;
this.tasks = tasks;
this.tinyDB = tinyDB;
}
@Override
public int getCount() {
return tasks.size();
}
@Override
public Object getItem(int position) {
return tasks.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
static class ViewHolder {
AppCompatCheckBox checkBox;
TextView taskTextView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.checkBox = (AppCompatCheckBox) convertView.findViewById(R.id.checkBox);
holder.taskTextView = (TextView) convertView.findViewById(R.id.taskTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//checkbox
int priority = tasks.get(position).getPriority();
int[][] states = new int[][]{new int[]{-android.R.attr.state_checked}, new int[]{android.R.attr.state_checked}};
int[] redColors = new int[]{context.getResources().getColor(R.color.radioBtnRed), context.getResources().getColor(R.color.radioBtnRed),};
int[] blueColors = new int[]{context.getResources().getColor(R.color.radioBtnBlue), context.getResources().getColor(R.color.radioBtnBlue),};
int[] greenColors = new int[]{context.getResources().getColor(R.color.radioBtnGreen), context.getResources().getColor(R.color.radioBtnGreen),};
if(priority == 1){
holder.checkBox.setSupportButtonTintList(new ColorStateList(states, redColors));
}
else if(priority == 2){
holder.checkBox.setSupportButtonTintList(new ColorStateList(states, blueColors));
}
else if(priority == 3){
holder.checkBox.setSupportButtonTintList(new ColorStateList(states, greenColors));
}
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
tasks.get(position).setIsChecked(isChecked);
tinyDB.putListObject(MainActivity.TASKS_FILE, tasks);
MainActivity.collectCheckedTasks();
}
});
boolean isChecked = tasks.get(position).isChecked();
if(isChecked){
holder.checkBox.setChecked(true);
}
//task title
String title = tasks.get(position).getTitle();
holder.taskTextView.setText(title);
return convertView;
}
}
のようなものに変更してください。あるいは、単にholder.checkBox.setChecked(isChecked); 'を実行し、' if'を取り除くこともできます。 –