2011-05-25 17 views
20

Mi aplicación usa un ListView que muestra diferentes elementos en la celda. debe tener una foto y un nombre, pero sucede que tiene una descripción y un ícono.¿Por qué desaparecen los elementos cuando me desplazo por listView?

El problema es el siguiente: cuando me desplazo al ListView y vuelvo a la parte superior, la descripción y los iconos han desaparecido, solo hay imagen y nombre. Tengo la impresión de que la descripción y los iconos se han eliminado para tener el mismo tamaño para cada fila.

Puedo usar un adaptador personalizado (BaseAdapter) para mi ListView:

public class MyAdapterPark extends BaseAdapter { 

    private ArrayList<DataPark> datapark; 
    private LayoutInflater myInflater; 

    public MyAdapterPark (Context context, ArrayList<DataPark> _datapark) 
    { 
     this.myInflater = LayoutInflater.from(context); 
     this.datapark = _datapark; 

    } 


    @Override 
    public int getCount() { 
     return this.datapark.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return this.datapark.get(arg0); 

    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


    public static class ViewHolder { 
     ImageView image; 
     TextView text01; 
     ImageView facebook; 
     ImageView twitter; 
     ImageView linkedin; 
     ImageView blog; 
     ImageView music; 
     TextView bio; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if(convertView == null) 
     { 
      convertView = myInflater.inflate(R.layout.affichageitem, null); 
      holder = new ViewHolder(); 
      holder.image = (ImageView)convertView.findViewById(R.id.img); 
      holder.text01 = (TextView)convertView.findViewById(R.id.user); 
      holder.facebook = (ImageView)convertView.findViewById(R.id.facebook); 
      holder.twitter = (ImageView)convertView.findViewById(R.id.twitter); 
      holder.linkedin = (ImageView)convertView.findViewById(R.id.linkedin); 
      holder.blog = (ImageView)convertView.findViewById(R.id.blog); 
      holder.music = (ImageView)convertView.findViewById(R.id.music); 
      holder.bio = (TextView)convertView.findViewById(R.id.bio); 



      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.text01.setText(datapark.get(position).nickname); 

     if (!(datapark.get(position).pic.equals(""))){ 
     try { 
      //byte[] decodedString; 
      //decodedString = Base64.decode(datapark.get(position).pic); 
      //Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
      //holder.image.setImageBitmap(bitmap); 
      holder.image.setImageBitmap(telechargerImage(datapark.get(position).pic)); 



     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     }else{ 
      holder.image.setImageResource(R.drawable.profilbase); 

     } 

     if (!(datapark.get(position).facebook.equals(""))){ 

      holder.facebook.setImageResource(R.drawable.fb); 

      }else{ 
       ((ImageView)convertView.findViewById(R.id.facebook)).setVisibility(View.GONE); 
      } 

     if (!(datapark.get(position).twitter.equals(""))){ 

      holder.twitter.setImageResource(R.drawable.twitter); 

      }else{ 
       ((ImageView)convertView.findViewById(R.id.twitter)).setVisibility(View.GONE); 
      } 

     if (!(datapark.get(position).linkedin.equals(""))){ 

      holder.linkedin.setImageResource(R.drawable.linkedin); 

      }else{ 
       ((ImageView)convertView.findViewById(R.id.linkedin)).setVisibility(View.GONE); 
      } 

     if (! (datapark.get(position).blog.equals(""))){ 

      holder.blog.setImageResource(R.drawable.blog); 

      }else{ 
       ((ImageView)convertView.findViewById(R.id.blog)).setVisibility(View.GONE); 
      } 


     if (!(datapark.get(position).music.equals(""))){ 

      holder.music.setImageResource(R.drawable.music); 

      }else{ 
       ((ImageView)convertView.findViewById(R.id.music)).setVisibility(View.GONE); 
      } 

     if (!(datapark.get(position).bio.equals(""))){   

      holder.bio.setText(datapark.get(position).bio); 

      }else{ 
       ((TextView)convertView.findViewById(R.id.bio)).setVisibility(View.GONE); 
      } 




     return convertView; 
    } 

    public static Bitmap telechargerImage(String url) { 
     Bitmap bm = null; 
     try { 
      URL aURL = new URL(url); 
      URLConnection conn = aURL.openConnection(); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      bm = BitmapFactory.decodeStream(bis); 
      bis.close(); 
      is.close(); 
     } catch (IOException e) { 
      Log.e("Erreur","Erreur lors de la récupération de l'image : " + e.getMessage().toString()); 
     } 
     return bm; 
    } 

} 

Y el XML de mi adaptador:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#eaf4f0" 
    > 

    <ImageView 
     android:id="@+id/img" 
     android:layout_width="70px" 
     android:layout_height="70px" 
     android:background="@drawable/carre" 
     android:scaleType="fitXY" 
     android:padding="5sp" 
     android:layout_marginLeft="0sp" 
     android:src="@drawable/profilbase" 
     android:layout_margin="5sp" 
     /> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingLeft="0sp" 
     android:layout_weight="1" 
     > 

     <TextView android:id="@+id/user" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="14px" 
      android:textColor="#000000" 
      android:textStyle="bold" 
      android:text=""  
      android:layout_marginTop="5sp" 
      /> 

      <TextView android:id="@+id/bio" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="14px" 
      android:textColor="#000000" 
      android:layout_marginTop="1sp" 
      android:layout_marginRight="2sp" 
      android:text=""  
      /> 

     <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="4sp" 
     android:layout_marginBottom="4sp" 
     > 
     <ImageView 
     android:id="@+id/facebook" 
     android:layout_width="17px" 
     android:layout_height="17px" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" 
     /> 
     <ImageView 
     android:id="@+id/twitter" 
     android:layout_width="17px" 
     android:layout_height="17px" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" 
     android:layout_marginLeft="5sp" 
     /> 
     <ImageView 
     android:id="@+id/linkedin" 
     android:layout_width="17px" 
     android:layout_height="17px" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" 
     android:layout_marginLeft="5sp" 
     /> 
     <ImageView 
     android:id="@+id/blog" 
     android:layout_width="17px" 
     android:layout_height="17px" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" 
     android:layout_marginLeft="5sp" 
     /> 
     <ImageView 
     android:id="@+id/music" 
     android:layout_width="17px" 
     android:layout_height="17px" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" 
     android:layout_marginLeft="5sp" 
     /> 
     </LinearLayout> 

    </LinearLayout> 

</LinearLayout> 

Gracias!

Respuesta

45

Es porque a veces ocultas algunas de tus vistas y nunca las vuelves a mostrar. Ejemplo:

 if (!(datapark.get(position).bio.equals(""))){   
      holder.bio.setText(datapark.get(position).bio); 
     }else{ 
      ((TextView)convertView.findViewById(R.id.bio)).setVisibility(View.GONE); 
     } 

en lugar de tratar:

 if (!(datapark.get(position).bio.equals(""))){ 
      holder.bio.setVisibility(View.VISIBLE);   
      holder.bio.setText(datapark.get(position).bio); 
     }else{ 
      holder.bio.setVisibility(View.GONE); 
     } 

Recuerde que las opiniones son reciclados, por lo que, a menos que muestran los puntos de vista que la próxima vez que regrese uno, que nunca será visible de nuevo. Además, recuerde que holder.bio es lo mismo que devuelve findViewById, por lo que puede hacer holder.bio.setVisibility(View.GONE) en el bloque else.

+0

¡Así es! ¡Gracias! – user420574

+4

GOd me has guardado de un desastre de 1 semana: D –

+0

nice @dmon ....... – Benjamin

0

Tuve el mismo problema.

 if (!imageuri.isEmpty()) { 
      rl.setVisibility(View.VISIBLE); 
      SmartImageView imageView = (SmartImageView) view.findViewById(R.id.detailimageView1); 
      imageView.setImageUrl(imageuri); 
     } else {    
      rl.setVisibility(View.GONE); 
     } 

¡Gracias por la solución!

Cuestiones relacionadas