2016-03-28 15 views
0

私は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; 
} 

}

+0

のようなものに変更してください。あるいは、単にholder.checkBox.setChecked(isChecked); 'を実行し、' if'を取り除くこともできます。 –

答えて

0

あなたのコード

if(isChecked){ 
    holder.checkBox.setChecked(true); 
} 

isCheckedがtrueの場合、それはチェックされた状態にあるチェックボックスを設定しますがisCheckedがfalseの場合、それは何もしません。 Checkedチェックボックスはオフのままですが、チェックされたままです。

は、あなたが `isChecked`が` false`をされた場合、 `checkbox`でのチェックを外すために`の場合(にisChecked) ``文のelse`が必要

holder.checkBox.setChecked(isChecked); 
+0

ありがとうございました!それは簡単な修正だった:) – Jared

関連する問題