각 행에 확인란과 텍스트 뷰가 포함되어있는 목록이 있습니다. 또한 목록의 모든 확인란을 선택/선택 취소해야하는 버튼이 있습니다. 화면의 바깥쪽에있는 체크 박스를 사용하여이 작업을 수행 할 수 있습니다. 화면의 바깥에있는 항목이 없기 때문에 잘 이해하면 스크롤하는 동안 새 행을 만들기 위해 재활용되고 화면 밖으로 체크 박스를 확인하거나 액세스하려고 할 때 색인 오류가 발생합니다.ListView에서 모든 확인란을 선택하는 방법
해결책을 찾았지만 지금까지 아무 것도 작동하지 않았습니다.
어떻게 해결할 수 있습니까? 더 많은 코드가 필요
public class AlumnoArrayAdapter<T> extends BaseAdapter{
Context mContext;
LayoutInflater mInflater;
ArrayList<T> mList;
ArrayList<Alumno> alumno;
boolean verEstadisticas;
SparseBooleanArray mSparseBooleanArray;
public AlumnoArrayAdapter(Context context, ArrayList<T> list, ArrayList<Alumno> alumno, boolean verEstadisticas) {
//TODO Auto-generated constructor stub
this.alumno = alumno;
this.verEstadisticas = verEstadisticas;
this.mContext = context;
mInflater = LayoutInflater.from(mContext);
mSparseBooleanArray = new SparseBooleanArray();
mList = new ArrayList<T>();
this.mList = list;
}
public ArrayList<T> getCheckedItems() {
ArrayList<T> mTempArry = new ArrayList<T>();
for(int i=0;i<mList.size();i++) {
if(mSparseBooleanArray.get(i)) {
mTempArry.add(mList.get(i));
}
}
return mTempArry;
}
public int getCount() {
return mList.size();
}
public Object getItem(int position) {
return mList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflater.inflate(R.layout.row, null);
}
TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
tvTitle.setText(mList.get(position).toString());
CheckBox mCheckBox = (CheckBox) convertView.findViewById(R.id.chkEnable);
mCheckBox.setTag((Integer) position);
mCheckBox.setChecked(mSparseBooleanArray.get(position));
mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
if(verEstadisticas){
mCheckBox.setVisibility(View.GONE);
}
mCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
Integer position = (Integer) cb.getTag();
alumno.get(position).setChecked(cb.isChecked());
}
});
return convertView;
}
OnCheckedChangeListener mCheckedChangeListener = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);
}
};
}
경우 알려 주시기 바랍니다 : 여기에
는 어댑터입니다.도움을 주시면 감사하겠습니다.
미리 감사드립니다.
편집 : 솔루션! 수정 된 어댑터를 얻었다 :
당신은 당신의 기본 데이터 구조에서 "확인"정보를 조작해야public class AlumnoArrayAdapter<T> extends BaseAdapter{
Context mContext;
LayoutInflater mInflater;
ArrayList<T> mList;
ArrayList<Alumno> alumno;
boolean verEstadisticas;
SparseBooleanArray mSparseBooleanArray;
boolean checarTodo = false;
public AlumnoArrayAdapter(Context context, ArrayList<T> list, ArrayList<Alumno> alumno, boolean verEstadisticas) {
//TODO Auto-generated constructor stub
this.alumno = alumno;
this.verEstadisticas = verEstadisticas;
this.mContext = context;
mInflater = LayoutInflater.from(mContext);
mSparseBooleanArray = new SparseBooleanArray();
mList = new ArrayList<T>();
this.mList = list;
}
public ArrayList<T> getCheckedItems() {
ArrayList<T> mTempArry = new ArrayList<T>();
for(int i=0;i<mList.size();i++) {
if(mSparseBooleanArray.get(i)) {
mTempArry.add(mList.get(i));
}
}
return mTempArry;
}
public int getCount() {
return mList.size();
}
public Object getItem(int position) {
return mList.get(position);
}
public long getItemId(int position) {
return position;
}
public void checkAll(){
for(int x = 0; x < alumno.size(); x++){
alumno.get(x).setChecked(!alumno.get(x).isChecked());
}
}
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflater.inflate(R.layout.row, null);
}
TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
tvTitle.setText(mList.get(position).toString());
CheckBox mCheckBox = (CheckBox) convertView.findViewById(R.id.chkEnable);
mCheckBox.setTag((Integer) position);
mCheckBox.setChecked(alumno.get(position).isChecked());
if(verEstadisticas){
mCheckBox.setVisibility(View.GONE);
}
mCheckBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
//Alumno Alumno = (Alumno) cb.getTag();
Integer position = (Integer) cb.getTag();
alumno.get(position).setChecked(cb.isChecked());
}
});
return convertView;
}
}
:
그런 다음이 같은 끝낼 것 완성도를 들어, 여기에 체크 할 뷰의 예입니다 아주. 정확히 제안한 내용을 약간 수정했습니다. "checkAll"플래그에 부울 속성을 사용하지 않았습니다. 대신 "checkAll"메서드에서 데이터 구조의 확인란에 대한 부울 데이터를 수정하고 notifyDataSetChanged를 호출하여 목록을 다시 그리는 대신 mSparseBooleanArray를 사용하여 확인란의 상태를 설정하는 대신 저장 위치에 ArrayList를 사용했습니다. 내가 필요한 데이터. OP에서 수정 된 어댑터를 볼 수 있으며 함께 수정했습니다. 다시 한 번 감사드립니다! – Moko