2012-02-08 16 views
9

Ho una lista di visualizzazione [visualizzazione testo e controlli casella di controllo] con più dati. Sceglierò la voce dalla visualizzazione elenco e visualizzerò gli elementi selezionati nella prossima attività. Il mio problema è, per esempio se scelgo il ventesimo e il venticinquesimo elemento nella visualizzazione elenco, visualizzerò alcuni altri elementi nella prossima attività. Questa è la vista della lista è cambiata durante lo scorrimento.la vista della lista è cambiata quando si scorre su Android

sto scegliendo un articolo facendo clic sulla casella di controllo sull'elemento. nel listener checkbox.setOnChanged ho scritto il codice per cui la posizione è selezionata o meno. se scelgo il 25 ° elemento e scorri la vista elenco, viene chiamato il metodo getview e il metodo checkbox.setonChanged cambia la posizione selezionata. Finalmente stampo il logcat.

mio formato di codifica:

public class ListContact extends ListActivity { 
    public void onCreate(Bundle icicle){ 
    ..... 
    ArrayAdapter<Model> adapter = new MyCustomArrayAdapter(this,getModel()); 
    setListAdapter(adapter); 
    } 
.... 
private List<Model> getModel() { 
    List<Model> list = new ArrayList<Model>(); 

Iterator<String> itr = constant.selectname.iterator(); 
    while (itr.hasNext()) { 
     list.add(get(itr.next().toString())); 
    } 
    return list; 
} 

private Model get(String s) { 
    return new Model(s); 
} 

} 

MyCustomArrayAdapter.java:

public class MyCustomArrayAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    constant con ; 
    public MyCustomArrayAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.list_layout, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

//  Log.e("getview", "getview"); 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.list_layout, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
      viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
         public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
//       con = new constant(); 
          Model element = (Model) viewHolder.checkbox.getTag(); 
          element.setSelected(buttonView.isChecked()); 
//       Log.e("MyCustomArrayAdapter.java", "selectpos array list length"+constant.selectpos.size()); 
          if(isChecked==true){ 
           Log.e("check box value and position ", element.getName()); 
           Log.e("position", ""+position); 
           con.selectpos.set(position, 1); 

          } 
          else{ 
           Log.e("position unselect", ""+position +"---------"+ element.getName()); 
           con.selectpos.set(position, 0); 
          } 
         } 
        }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
} 

risultato logcat:

02-08 10:44:28.142: E/check box value and position(293): AAAA Qqq 
02-08 10:44:28.142: E/check box value and position(293): Mobile-123 
02-08 10:44:28.152: E/position(293): 0 

**after scrolling the list view some other item print 0th position unselected and wrong data:** 
02-08 10:44:31.962: E/position unselect(293): 0---------F212 
02-08 10:44:31.962: E/position unselect(293): Home-232 
+0

come stai selezionati gli elementi. se vuoi ottenere il 25 ° elemento, normalmente fai qualcosa come getListView(). getAdapter.getItem (25); – blessenm

+0

sto selezionando un elemento facendo clic sulla casella di controllo sulla voce di elenco. questo è il metodo viewHolder.checkbox.setOnCheckedChangeListener (..) nel metodo getView –

risposta

21

Ho risolto il problema. aggiungo il cambiamento

View view = null; 
    convertView = null; //in the get view and comments the else part of 
     if (convertView == null) { 
       } 
       /*else{ 
       } */ 
+0

quel caso noi non usano mai il modello Viewholder. – Prakash

+0

risolve il mio problema, grazie amico risparmi la giornata .. –

+0

salva la mia giornata. grazie molto!!!!! – pavlos

0

io consiglierei di remodify tuo GetView come questo. Questo mi ha aiutato.

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder =null; 
//  Log.e("getview", "getview"); 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.list_layout, null); 
      holder =(ViewHolder) view.getTag(); 
      viewHolder.text = (TextView) view.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 

      view.setTag(viewHolder); 

     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
    viewHolder.checkbox.setTag(list.get(position)); 

     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
      viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
         public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
//       con = new constant(); 
          Model element = (Model) viewHolder.checkbox.getTag(); 
          element.setSelected(buttonView.isChecked()); 
//       Log.e("MyCustomArrayAdapter.java", "selectpos array list length"+constant.selectpos.size()); 
          if(isChecked==true){ 
           Log.e("check box value and position ", element.getName()); 
           Log.e("position", ""+position); 
           con.selectpos.set(position, 1); 

          } 
          else{ 
           Log.e("position unselect", ""+position +"---------"+ element.getName()); 
           con.selectpos.set(position, 0); 
          } 
         } 
        }); 
     return view; 
    } 
} 
+0

Ciao amico, ottengo Eccezione NullPointer a viewHolder.text = (TextView) view.findViewById (R.id.label); quando si compila l'elenco –

+0

provare ad utilizzare "titolare" invece di viewHolder, come holder.text = (TextView) view.findViewById (R.id.label) –

+0

ottengo lo stesso errore nello stesso punto. mi aiuti per favore. –

0

questo nella vostra classe di adattatori  

View view = null; 

a

View view = convertView;