ListView没有绘制每个listitem

时间:2013-09-26 14:27:47

标签: android listview

我遇到了问题而且我真的找不到导致它的原因。

我有一个包含4种项目类型的ListView(getViewTypeCount()返回4)。视图类型0,1和3工作正常。但是,View类型2的问题是只绘制了一些类型为2的项目。表示类型2的视图是ViewPager。

绘制的ViewPagers完美无缺。未绘制的ViewPagers,只显示白色。当我尝试滚动浏览ViewPager时,它会在侧面显示蓝色光晕,以显示您位于第一页或最后一页。每次页面的数量都是正确的。

ViewPager包含一个NormalSectionFragment,其余的ViewPager是每页PhotoSectionFragments上都有照片的页面。

我确信有几件事:

  • 每次ViewPager出现(或应该出现)时,都会调用ViewPager中Fragments的onCreateView方法
  • 当我一直向下滚动并向上滚动时,每个ViewPager都会被绘制并完美地运行

我可以通过编程方式向下滚动和备份来解决它,但我不认为这是解决问题的正确方法。

Screenshot with item view types

getItemViewType方法:

@Override
public int getItemViewType(int position) {
    NieuwsItem item = getItem(position);
    if (item instanceof NormalNieuwsItem)
        return VIEW_TYPE_NORMAL;
    else
        if (item instanceof TeaserNieuwsItem)
            return VIEW_TYPE_TEASER;
        else
            return ((FacebookNieuwsItem) item).isPhoto() ? VIEW_TYPE_FACEBOOK_PHOTO : VIEW_TYPE_FACEBOOK;
}

这是列表适配器的getView()方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    NieuwsItem item = getItem(position);

    switch (getItemViewType(position)) {
    case 0:
        if (convertView == null)
            convertView = LayoutInflater.from(context).inflate(R.layout.listitem_nieuwsitem, null);

        TextView titleView = (TextView) convertView.findViewById(R.id.titleView);
        TextView subTitleView = (TextView) convertView.findViewById(R.id.subTitleView);
        titleView.setText(item.getTitle());
        subTitleView.setText(item.getSubTitle());
        TextView createdAtView = (TextView) convertView.findViewById(R.id.createdAtView);
        createdAtView.setText(Tools.getDateString(getContext(), ((NormalNieuwsItem) item).getCreatedAt()));

        return convertView;
    case 1:
        if (convertView == null)
            convertView = LayoutInflater.from(context).inflate(R.layout.listitem_teaseritem, null);

        TextView teaserTitleView = (TextView) convertView.findViewById(R.id.teaserTitle);
        ImageView teaserImageView = (ImageView) convertView.findViewById(R.id.teaserImage);
        teaserTitleView.setText(item.getTitle());
        Bitmap bmp = ((TeaserNieuwsItem) item).getImage();
        if (bmp != null)
            teaserImageView.setImageBitmap(bmp);

        return convertView;
    case 2:
        FacebookNieuwsItem fbPhotoItem = (FacebookNieuwsItem) item;

        if (convertView == null)
            convertView = LayoutInflater.from(context).inflate(R.layout.listitem_facebookitem_photo, null);
        ViewPager pager = (ViewPager) convertView.findViewById(R.id.facebookPhotoPager);
        PhotoPagerAdapter adapter = new PhotoPagerAdapter(fm, fbPhotoItem);
        pager.setAdapter(adapter);
        pager.setPageMargin(-40);
        pager.setCurrentItem(0, true);

        pager.setOffscreenPageLimit(5);
        return convertView;
    case 3:
        FacebookNieuwsItem fbItem = (FacebookNieuwsItem) item;

        convertView = LayoutInflater.from(context).inflate(R.layout.listitem_facebookitem, null);
        TextView content = (TextView) convertView.findViewById(R.id.facebook_content);
        TextView likeCount = (TextView) convertView.findViewById(R.id.facebook_likecount);
        TextView commentCount = (TextView) convertView.findViewById(R.id.facebook_commentcount);
        TextView createdAt = (TextView) convertView.findViewById(R.id.facebook_date);

        if (fbItem.isPhoto())
            content.setText(fbItem.getTitle());
        else
            content.setText(fbItem.getContent());
        likeCount.setText(Integer.toString(fbItem.getLikeCount()));
        commentCount.setText(Integer.toString(fbItem.getCommentCount()));
        createdAt.setText(Tools.getDateString(getContext(), fbItem.getCreatedAt()));

        return convertView;
    default:
        return null;
    }

}

ViewPager适配器:

public class PhotoPagerAdapter extends FragmentStatePagerAdapter {

    private FacebookNieuwsItem item;

    public PhotoPagerAdapter(FragmentManager fm, FacebookNieuwsItem item) {
        super(fm);
        this.item = item;
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment;
        if (i == 0)
            fragment = NormalSectionFragment.newInstance(item);
        else {
            String url = Tools.PHOTO_URL_PREFIX + item.getPhoto(i - 1) + Tools.PHOTO_URL_SUFFIX;
            fragment = PhotoSectionFragment.newInstance(url);
        }
        return fragment;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return Integer.toString(position);
    }

    @Override
    public int getCount() {
        return item.getPhotoCount() + 1;
    }

}

PhotoSectionFragment:

public static class PhotoSectionFragment extends Fragment {

    private ImageView image;
    private String url;

    public static PhotoSectionFragment newInstance(String url) {
        PhotoSectionFragment fragment = new PhotoSectionFragment();
        fragment.setUrl(url);
        return fragment;
    }

    private void setUrl(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    public PhotoSectionFragment() {
    }

    public void setImage(Bitmap bmp) {
        Bitmap scaled = Bitmap.createScaledBitmap(bmp, 100, 60, true);
        bmp.recycle();
        image.setImageBitmap(scaled);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d("photo_oncreateview_start", "url: " + url);

        View view = inflater.inflate(R.layout.fb_photo_item, null);
        image = (ImageView) view.findViewById(R.id.facebookPhoto);

        return view;
    }
}

NormalSectionFragment:

public static class NormalSectionFragment extends Fragment {

    private FacebookNieuwsItem item;

    public NormalSectionFragment() {
    }

    public static NormalSectionFragment newInstance(FacebookNieuwsItem item) {
        NormalSectionFragment section = new NormalSectionFragment();
        section.setItem(item);
        return section;
    }

    private void setItem(FacebookNieuwsItem item) {
        this.item = item;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d("reg_oncreateview_start", item.getTitle());
        View view = inflater.inflate(R.layout.listitem_facebookitem_viewpager, null);
        TextView content = (TextView) view.findViewById(R.id.facebook_content);
        TextView likeCount = (TextView) view.findViewById(R.id.facebook_likecount);
        TextView commentCount = (TextView) view.findViewById(R.id.facebook_commentcount);
        TextView createdAt = (TextView) view.findViewById(R.id.facebook_date);

        content.setText(item.getTitle());
        likeCount.setText(Integer.toString(item.getLikeCount()));
        commentCount.setText(Integer.toString(item.getCommentCount()));
        createdAt.setText(DateTimeUtils.getInstance(getActivity()).getTimeDiffString(item.getCreatedAt().getTimeInMillis()));

        view.setClickable(true);
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                ((MainActivity) getActivity()).requestNieuwsDetailPage(item);
            }
        });

        return view;
    }
}

1 个答案:

答案 0 :(得分:0)

我通过使用普通视图而不是片段来修复它。不知道有可能