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都被繪製並且工作正常
我可以通過編程方式向下滾動並備份來解決它,但我不認爲這是解決它的正確方法。
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;
}
}
用於調試。你有沒有嘗試在你的getView的默認情況下返回convertView而不是null,以檢查是否存在問題。 – HpTerm
即使認爲你說它是正確實施,你可以顯示你的getItemViewType – HpTerm
我試過了,但仍然是相同的結果。另外,添加getItemViewType問題.. –