CheckBox se desactiva en desplazamiento en una vista de lista personalizada

Sé que esta pregunta se ha hecho una y otra vez, pero todavía no he sido capaz de encontrar una sugerencia que realmente me ayuda. La casilla de verificación está desmarcada cuando la lista se desplaza hacia abajo. Sí, estoy usando una matriz booleana para almacenar los valores, pero esto todavía no soluciona el problema. Aquí está mi código. Por favor sugiera una solución para esto. Gracias.

public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder holder; final boolean[] itemChecked=new boolean[30]; LayoutInflater inflater = context.getLayoutInflater(); if(convertView==null) { convertView = inflater.inflate(R.layout.custom_list, null); holder = new ViewHolder(); holder.txtViewTitle = (TextView) convertView.findViewById(R.id.title_text); holder.txtViewDescription = (TextView) convertView.findViewById(R.id.description_text); holder.cb=(CheckBox) convertView.findViewById(R.id.cb); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub itemChecked[position] = isChecked; if(itemChecked[position]) { holder.cb.setChecked(true); } else { holder.cb.setChecked(false); } holder.txtViewTitle.setText(title[position]); holder.txtViewDescription.setText(description[position]); holder.cb.setChecked(itemChecked[position]); holder.txtViewDescription.setFocusable(false); holder.txtViewTitle.setFocusable(false); return convertView; } } 

3 Solutions collect form web for “CheckBox se desactiva en desplazamiento en una vista de lista personalizada”

GetView () se llama cuando se necesita dibujar un elemento de lista previamente invisible. Puesto que usted reconstruye itemChecked[] cada vez que se llama a este método, tendrá la casilla de verificación nueva desmarcada y una matriz diferente para cada vista resultante. (Final en Java no hace ese campo único como en C) La manera más simple de resolver que es hacer itemChecked un itemChecked y set / restore casilla de verificación estado basado en ese.

 public class MyListAdapter extends ArrayAdapter<Object> { private final boolean[] mCheckedState; private final Context mContext; public MyListAdapter(Context context, int resource, int textViewResourceId, List<Object> objects) { super(context, resource, textViewResourceId, objects); mCheckedState = new boolean[objects.size()]; mContext = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { // simplified to just a Checkbox // ViewHolder and OnCheckedChangeListener stuff left out CheckBox result = (CheckBox)convertView; if (result == null) { result = new CheckBox(mContext); } result.setChecked(mCheckedState[position]); return result; } } 

Aquí hay un ejemplo. Lea los comentarios en el getView (…) del adaptador que se proporciona a continuación.


 class TaskObject { private int pid; private String processName; private boolean toKill; ///getters/setters public boolean isToKill() { return toKill; } public void setToKill(boolean toKill) { this.toKill = toKill; } ................................ } 

 class TaskListAdapter extends BaseAdapter { private static final String TAG = "adapter"; ArrayList<TaskObject> list; Context context; public TaskListAdapter(Context context) { Log.d(TAG, "created new task list adapter"); this.context = context; if (list == null) { list = new ArrayList<TaskObject>(); } } public void addTask(TaskObject taskObject) { list.add(taskObject); } public void clearTasks() { list.clear(); Log.d(TAG, "list size:" + list.size()); this.notifyDataSetChanged(); } public int getCount() { return list.size(); } public TaskObject getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { RelativeLayout rl = new RelativeLayout(context); TextView textPid = new TextView(context); textPid.setText(Integer.toString(getItem(position).getPid())); TextView textName = new TextView(context); textName.setText(getItem(position).getProcessName()); /////Here is your and it will set back your checked item after scroll CheckBox chckKill = new CheckBox(context); if(getItem(position).isToKill()) { chckKill.setChecked(true); } //////////////////////////////////////////////////////////////////// chckKill.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //is chkIos checked? if (((CheckBox) v).isChecked()) { getItem(position).setToKill(true); } } }); chckKill.setTag(getItem(position).getPid()); /////////NOT LAYOUTED USE LAYOUT rl.addView(chckKill); rl.addView(textName); rl.addView(textPid); return rl; } 

Espero que ayude abit.

En mi caso, resolví este problema de la siguiente manera:

 @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; TextView title = null; ImageView thumbnail = null; CheckBox checkBox = null; Content rowData = GridViewActivity.contents.get(position); if (null == convertView) { convertView = mInflater.inflate(R.layout.grid_item, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } holder = (ViewHolder) convertView.getTag(); title = holder.getContentTitle(); title.setText(rowData.getTitle()); thumbnail = holder.getThumbnail(); thumbnail.setImageResource(rowData.getIcon()); checkBox = holder.getCheckBox(); checkBox.setTag(position); checkBox.setChecked(rowData.isCheckBox()); checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); GridViewActivity.notifyCheckChanges(getPosition, buttonView.isChecked()); } }); return convertView; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.