2012-02-16 24 views
9

So che questa domanda è stata ripetuta più volte, ma ancora non sono stato in grado di trovare un suggerimento che mi aiuti veramente. La casella di controllo è deselezionata ogni volta che si scorre l'elenco verso il basso. Sì, sto usando un array booleano per memorizzare i valori, ma questo non risolve il problema. Ecco il mio codice. Si prega di suggerire una soluzione per questo. Grazie.CheckBox si deseleziona durante lo scorrimento in un listview personalizzato

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; 

} 

} 

risposta

11

getView() viene chiamato ogniqualvolta deve essere disegnata una voce di elenco precedentemente invisibile. Dal momento che si ricrea itemChecked[] ogni volta che viene chiamato questo metodo, si deselezionerà la nuova casella di controllo e una matrice diversa per ogni vista risultante. (finale in Java non rende quel campo univoco come in C) Il modo più semplice per risolvere è quello di rendere itemChecked un membro della classe e impostare/ripristinare lo stato della casella di controllo in base a quello.

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 che risolto il problema. Ero stupido Grazie. – Dinesh

+0

Ho aggiornato il codice un po '. Probabilmente non funziona davvero :) – zapl

+0

mCheckedState = new boolean [objects.size()]; In questa linea cosa è l'oggetto ?? –

3

Ecco un esempio. Leggi i commenti nel getView (...) dell'adattatore fornito di seguito.


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

Speranza che aiuta un po 'nervosa.

+0

grazie ma la risposta di Zapi mi ha aiutato correggi il mio problema – Dinesh

+0

aye. va bene solo fornito un esempio. –

+0

@SergeyBenner ha lo stesso problema http://stackoverflow.com/questions/35552911/onscroll-selected-checkbox-getting-unchecked-using-listiview –

2

In mycase, ho risolto questo problema come segue:

@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

In questo esempio, cos'è GridViewActivity ?? –

Problemi correlati