2013-09-26 58 views
1

我有一個問題,我真的找不到是什麼原因導致它。ListView沒有繪製每個listitem

我有一個ListView有4個項目類型(getViewTypeCount()返回4)。視圖類型0,1和3工作正常。但是,視圖類型2的問題是隻繪製了一些類型爲2的項目。表示類型2的視圖是ViewPager。

繪製的ViewPagers完美地工作。未繪製的ViewPagers只顯示白色。當我嘗試瀏覽該ViewPager時,它會在側面顯示藍色光芒,以顯示您位於第一頁或最後一頁。頁面數量每次都是正確的。

ViewPager包含一個NormalSectionFragment,其餘的ViewPager是在每個頁面上都有一張照片的頁面PhotoSectionFragments。

有幾件事情我可以肯定的:

  • 在ViewPager碎片的onCreateView方法被稱爲每次ViewPager出現時間(或應顯示)
  • 當我滾動一路每個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; 
    } 
} 
+0

用於調試。你有沒有嘗試在你的getView的默認情況下返回convertView而不是null,以檢查是否存在問題。 – HpTerm

+0

即使認爲你說它是正確實施,你可以顯示你的getItemViewType – HpTerm

+0

我試過了,但仍然是相同的結果。另外,添加getItemViewType問題.. –

回答

0

我通過使用正常瀏覽代替片段固定它。不知道這是可能的