2010-12-08 5 views
3

au début, la liste montre trois éléments et quand je défile vers le bas, il crée le quatrième et cinquième élément, mais le sixième et les suivants ne sont pas créés. Ces vues mélangent les informations avec les cinq premiers éléments et elles sont répétées jusqu'à ce que l'application plante avec une exception ClassCastException. La raison pour laquelle c'est simple, chaque élément a une disposition et un type différents, et j'ai un ViewHolder différent pour chacun. Donc, comme les vues ne sont pas créées, les ViewHolders sont les mêmes que les cinq premiers éléments, et lorsque la liste atteint un ViewHolder différent, il plante (c'est la chance que cela arrive au douzième élément). J'ai besoin de découvrir pourquoi les éléments se mélangent avec les premiers.Android Listview répéter les éléments commençant un élément spécifique

Ceci est le code de l'adaptateur, je pense que c'est suffisant.

public class PostsListAdapter extends BaseAdapter { 
    private FacebookPost[] posts; 
    private LayoutInflater mInflater; 

    public PostsListAdapter (Context ctx, FacebookPost[] user_posts) { 
     mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     posts = user_posts; 
    } 

    @Override 
    public int getCount() { 
     return posts.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return posts[position]; 
    } 

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

    private abstract static class ViewHolder { 
     TextView fromName; 
     TextView arrow; 
     TextView toName; 
     TextView message; 
     TextView attribution; 

    } 
    private static class VideoViewHolder extends ViewHolder { 
     TextView name; 
     TextView caption; 
     TextView description; 
     ImageView icon; 
    } 
    private static class PhotoViewHolder extends ViewHolder { 
    } 
    private static class LinkViewHolder extends ViewHolder { 
    } 
    private static class StatusViewHolder extends ViewHolder { 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     Log.d("POSITION",""+position); 
     if(convertView == null) { 
      switch(posts[position].getType()) { 
       case FacebookPost.VIDEO: 
        Log.d(""+position,"VIDEO"); 
        convertView = mInflater.inflate(R.layout.post_list_item_video, parent, false); 
        holder = new VideoViewHolder(); 
        holder.fromName = (TextView)convertView.findViewById(R.id.post_list_item_video_from_name); 
        holder.arrow = (TextView)convertView.findViewById(R.id.post_list_item_video_arrow); 
        holder.toName = (TextView)convertView.findViewById(R.id.post_list_item_video_to_name); 
        holder.message = (TextView)convertView.findViewById(R.id.post_list_item_video_message); 
        ((VideoViewHolder)holder).name = (TextView)convertView.findViewById(R.id.post_list_item_video_name); 
        ((VideoViewHolder)holder).caption = (TextView)convertView.findViewById(R.id.post_list_item_video_caption); 
        ((VideoViewHolder)holder).description = (TextView)convertView.findViewById(R.id.post_list_item_video_description); 
        break; 
       case FacebookPost.LINK: 
        Log.d(""+position,"LINK"); 
        convertView = mInflater.inflate(R.layout.post_list_item_link, parent, false); 
        holder = new LinkViewHolder(); 
        holder.fromName = (TextView)convertView.findViewById(R.id.post_list_item_link_from_name); 
        holder.arrow = (TextView)convertView.findViewById(R.id.post_list_item_link_arrow); 
        holder.toName = (TextView)convertView.findViewById(R.id.post_list_item_link_to_name); 
        holder.message = (TextView)convertView.findViewById(R.id.post_list_item_link_message); 
        break; 
       case FacebookPost.STATUS: 
        Log.d(""+position,"STATUS"); 
        convertView = mInflater.inflate(R.layout.post_list_item_status, parent, false); 
        holder = new StatusViewHolder(); 
        holder.fromName = (TextView)convertView.findViewById(R.id.post_list_item_status_from_name); 
        holder.arrow = (TextView)convertView.findViewById(R.id.post_list_item_status_arrow); 
        holder.toName = (TextView)convertView.findViewById(R.id.post_list_item_status_to_name); 
        holder.message = (TextView)convertView.findViewById(R.id.post_list_item_status_message); 
        break; 
       case FacebookPost.PHOTO: 
        Log.d(""+position,"PHOTO"); 
        convertView = mInflater.inflate(R.layout.post_list_item_photo, parent, false); 
        holder = new PhotoViewHolder(); 
        holder.fromName = (TextView)convertView.findViewById(R.id.post_list_item_photo_from_name); 
        holder.arrow = (TextView)convertView.findViewById(R.id.post_list_item_photo_arrow); 
        holder.toName = (TextView)convertView.findViewById(R.id.post_list_item_photo_to_name); 
        holder.message = (TextView)convertView.findViewById(R.id.post_list_item_photo_message); 
        break; 
       default: 
        holder=null; 
        break; 
      } 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     Spanned text = Html.fromHtml(posts[position].getFrom().getName()); 
     holder.fromName.setText(text); 

     if(posts[position].getTo() != null) 
      text = Html.fromHtml(posts[position].getTo()[0].getName()); 
     else 
      text=null; 
     if(text==null) { 
      holder.arrow.setVisibility(View.GONE); 
      holder.toName.setVisibility(View.GONE); 
     } else 
      holder.toName.setText(text); 

     text = Html.fromHtml(posts[position].getMessage()); 
     holder.message.setText(text); 

     switch(posts[position].getType()) { 
      case FacebookPost.VIDEO: 
       text = Html.fromHtml(((FacebookVideoPost)posts[position]).getCaption()); 
       Log.d("CAST: "+position,holder.getClass().getName()); 
       ((VideoViewHolder)holder).caption.setText(text); 
       text = Html.fromHtml(((FacebookVideoPost)posts[position]).getName()); 
       ((VideoViewHolder)holder).name.setText(text); 
       text = Html.fromHtml(((FacebookVideoPost)posts[position]).getDescription()); 
       ((VideoViewHolder)holder).description.setText(text); 
       break; 
      case FacebookPost.LINK: 
       break; 
      case FacebookPost.STATUS: 
       Log.d("CAST: "+position,holder.getClass().getName()); 
       break; 
      case FacebookPost.PHOTO: 
       break; 
     } 

     return convertView; 
    } 
} 

Merci pour tout.

+0

Comme vous faites beaucoup de moulages, pouvez-vous préciser où est throwed la 'ClassCastException' exactement? – tbruyelle

Répondre

2

Je suppose que vous manquez getViewTypeCount

+0

Merci! J'avais besoin d'ajouter aussi getItemViewType pour que ça fonctionne parfaitement! Encore merci. – Adrian

Questions connexes