簡體   English   中英

Android Listview重復啟動特定項目的項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM