2012-02-16 6 views
9

Sé que esta pregunta se ha formulado una y otra vez, pero aún así no he podido encontrar una sugerencia que realmente me ayude. La casilla de verificación está desmarcada siempre que la lista se desplaza hacia abajo. Sí, estoy usando una matriz booleana para almacenar los valores, pero esto aún no soluciona el problema. Aquí está mi código. Por favor sugiere una solución para esto. Gracias.CheckBox se desmarca en el desplazamiento en una vista de lista personalizada

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; 

} 

} 

Respuesta

11

getView() se invoca cada vez que se debe dibujar un elemento de lista previamente invisible. Como recrea itemChecked[] cada vez que se llama a este método, tendrá desactivada la casilla de verificación nueva y una matriz diferente para cada vista resultante. (El final en Java no hace que ese campo sea único como en C) La forma más simple de resolverlo es hacer que itemChecked sea un miembro de la clase y establecer/restaurar el estado de la casilla de verificación en función de 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; 
    } 
} 
+0

@Zapi que solucionó el problema. Estaba siendo tonto. Gracias. – Dinesh

+0

He actualizado el código un poco. Probablemente no esté realmente funcionando :) – zapl

+0

mCheckedState = new boolean [objects.size()]; En esta línea, ¿qué es objeto? –

3

Aquí hay un ejemplo. Lea los comentarios en el getView (...) del adaptador provisto 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 un poco.

+0

gracias, pero la respuesta de Zapi me ha ayudado arreglar mi problema – Dinesh

+0

aye. está bien solo proporciona un ejemplo. –

+0

@SergeyBenner obtener el mismo problema http://stackoverflow.com/questions/35552911/onscroll-selected-checkbox-getting-unchecked-using-listiview –

2

En myCASE, he resuelto 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; 
} 
+0

En este ejemplo, ¿qué es GridViewActivity? –

Cuestiones relacionadas