[英]Android Listview repeat the items starting a specific item
在開始時,列表顯示三個項目,當我向下滾動時,它會創建第四個和第五個項目,但是第六個和下一個項目沒有被創建。 這些視圖將信息與前五項混合在一起,然后重復這些視圖,直到應用程序因ClassCastException崩潰。 它很簡單,每個項目都有不同的布局和類型,每個項目都有不同的ViewHolder。 因此,由於未創建視圖,ViewHolders與前五個項目相同,當列表到達具有不同ViewHolder的視圖時,它會崩潰(幸運的是它發生在第十二個項目)。 我需要發現為什么這些物品與第一批物品混合在一起。
這是適配器的代碼,我認為這已經足夠了。
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;
}
}
謝謝你的一切。
我猜你錯過了getViewTypeCount
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.