2012-02-08 17 views
9

Tengo vista de lista [controles de vista de texto y casilla de verificación] con más datos. Elegiré el elemento de la vista de lista y mostraré los elementos seleccionados en la siguiente actividad. Mi problema es que, por ejemplo, si elijo el 20º y el 25º elemento en la vista de lista, se mostrarán otros elementos en la siguiente actividad. Esa es la posición de la vista de lista se está cambiando cuando se desplaza.la posición de la vista de lista se está modificando al desplazarse por android

Estoy eligiendo un elemento haciendo clic en la casilla de verificación del artículo. en la casilla de verificación.setOnChanged oyente escribí código para qué posición se selecciona o no. si elijo el 25º elemento y desplazo la vista de lista, se llama al método getview y el método checkbox.setonChanged cambia la posición seleccionada. Imprimo el logcat por fin.

Mi formato de codificación:

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

resultado 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

how are you seleccionar elementos. si desea obtener los artículos 25, normalmente hace algo como getListView(). getAdapter.getItem (25); – blessenm

+0

estoy seleccionando un elemento haciendo clic en la casilla de verificación en el elemento de la lista. esto está llamando al método viewHolder.checkbox.setOnCheckedChangeListener (..) en el método getView –

Respuesta

21

He resuelto el problema. agrego el cambio

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

ese caso nunca usan el patrón del Visualizador. – Prakash

+0

resuelve mi problema, gracias hombre que salves mi día ... –

+0

salva mi día. ¡¡¡¡¡muchas gracias!!!!! – pavlos

0

yo le recomendaría a su remodify getView como este. Esto me ayudó.

@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

Hola amigo, me sale la Excepción de NullPointer en viewHolder.text = (TextView) view.findViewById (R.id.label); cuando llene la lista –

+0

trate de usar "holder" en lugar de viewHolder, como holder.text = (TextView) view.findViewById (R.id.label) –

+0

obtengo el mismo error en el mismo punto. por favor, ayúdame. –

0

esto en su clase adaptador  

View view = null; 

a

View view = convertView; 
Cuestiones relacionadas