我试图将多个ViewPagers
充气到ScrollView
,其中每个ViewPager
正在使用FragmentStatePagerAdapter。
ViewPager
由每个页面包含三个ImageViews
的片段组成。
我使用UniversalImageLoader进行图像的异步加载,但是我无法使用懒惰的加载工作。
问题是,当我的应用程序正在膨胀时,可以为每个ViewPagers
设置10个ImageViews
,其中TripplePosterFragment1
为ViewPagers
,另外10个ImageViews
为TripplePosterFragment2
自mPager.setOffscreenPageLimit(1)
开始以来progressLayout
。{/ p>
在MainFragment
期间,共有60个异步请求可见。
我的private void renderSubCarousels(ArrayList<Carousel> carousels) {
LayoutInflater mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int i = 1;
LinearLayout subCarouselLayout = (LinearLayout) mScrollView.findViewById(R.id.index_subcategory_carousel_container);
for (final Carousel carousel : carousels) {
RelativeLayout carouselWrapper = (RelativeLayout) mInflater.inflate(R.layout.main_pager_layout, null);
LinearLayout mContainer = (LinearLayout) carouselWrapper.findViewById(R.id.main_pager_container);
mContainer.setId(Constants.BASEID_LINEARLAYOUT + i);
ViewPager mPager = (ViewPager) mContainer.findViewById(R.id.main_pager);
mPager.setId(Constants.BASEID_VIEWPAGER + i);
mPager.setAdapter(new PagerPosterAdapter(getFragmentManager(),Constants.TRIPLE_POSTERS, carousel));
subCarouselLayout.addView(carouselWrapper);
i++;
}
progressLayout.setVisibility(View.GONE);
}
使用以下方法:
FragmentStatePagerAdapter
我的public class PagerPosterAdapter extends FragmentStatePagerAdapter {
private int mPageSize;
private Carousel mCarousel;
public PagerPosterAdapter(FragmentManager fm, int pageSize, Carousel carousel) {
super(fm);
this.mPageSize = pageSize;
this.mCarousel = carousel;
}
@Override
public int getCount() {
int maxPageIndex = (int) Math.ceil((float) mCarousel.getAssets().size() / mPageSize);
return maxPageIndex;
}
@Override
public Fragment getItem(int position) {
ArrayList<Asset> assets = mCarousel.getAssets();
int from = position*mPageSize;
int to = (position+1)*(mPageSize);
if(to > assets.size()-1)
to = assets.size();
return (TripplePosterFragment.newInstance(assets.subList(from, to)));
}
}
:
TripplePosterFragment
ImageView渲染发生的private void initViews() {
ImageView mFirstImageView = (ImageView) mLinearLayout.findViewById(R.id.first_pager_poster);
ImageView mSecondImageView = (ImageView)mLinearLayout.findViewById(R.id.second_pager_poster);
ImageView mThirdImageView = (ImageView)mLinearLayout.findViewById(R.id.third_pager_poster);
for(int i = 0;i < assets.size(); i++){
ImageView image = null;
switch(i){
case 0:
image = (ImageView) mLinearLayout.findViewById(R.id.first_pager_poster);
break;
case 1:
image = (ImageView) mLinearLayout.findViewById(R.id.second_pager_poster);
break;
case 2:
image = (ImageView) mLinearLayout.findViewById(R.id.third_pager_poster);
break;
default:
continue;
}
//The ScrollView in MainFragment
CustomScrollView mParentScrollView = (CustomScrollView)getActivity().findViewById(R.id.index_scrollviewparent);
Rect scrollBounds = new Rect();
mParentScrollView.getHitRect(scrollBounds);
if (image.getLocalVisibleRect(scrollBounds)) {
// Any portion of the imageView, even a single pixel, is within the visible window
ImageLoader.getInstance().displayImage(assets.get(i).getPoster(), image);
System.out.println("Im within");
else {
// NONE of the imageView is within the visible window
System.out.println("Im NOT within");
}
}
}
:
System.out.println("Im NOT within");
我需要检查图像是否可见并在它们出现时加载它们。但是Log
中的ListViews
是垃圾邮件。我确定有一种方法可以做到这一点,但我需要一些帮助。
我已经尝试过快速处理ListView中的大部分内容但是它不是最佳的,至少在阅读之后,ViewPager inside ListView
更新
与以前相同的核心问题,但是使用了一种新方法HorizontalListViews Pagead。的实例。
ArrayAdapter
似乎是要走的路。通过使用ListView
填充多个HListViews
延迟的常规垂直horizontalAdapter
,每个新行垂直加载图像,并按照预期水平加载每个图像。
问题:水平位置丢失。 public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View view = convertView;
if (view == null) {
holder = new ViewHolder();
view = mInflater.inflate(R.layout.carousel_frame_layout, null);
holder.carouselList = (HListView) view.findViewById(R.id.hListView);
view.setTag(holder);
}
else {
holder = (ViewHolder) view.getTag();
}
Carousel mCarousel = mData.get(position);
// Problem: Re-uses adapters from convertview
if (holder.carouselList.getAdapter() == null) {
SubCategoryCarouselAdapter horizontalAdapter = new SubCategoryCarouselAdapter(mContext, mCarousel.getAssets());
holder.carouselList.setAdapter(horizontalAdapter);
} else {
((SubCategoryCarouselAdapter) holder.carouselList.getAdapter()).update(mCarousel.getAssets());
}
return view;
}
从循环视图继承到下一个列表项。此将新列表项定位到回收列表项的位置。
horizontalAdapter
解决方案可能是将内部HListView
保存到指定的列表项位置,但是当HListViews
本身被回收时,我不知道如何执行此操作。
更新3
为ViewPagers
找到了有效的解决方案。但我仍然要测试这是否适用于addHeaderView
。
对于每个内部ListView
,在父HListView
上使用LayoutInflater mInflater = (LayoutInflater) getActivity().getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
for (final Carousel carousel : carousels) {
View carouselWrapper = mInflater.inflate(R.layout.carousel_sub_category_layout, null);
listView.addHeaderView(carouselWrapper);
listView.setAdapter(null);
HListView horizontalList = (HListView) carouselWrapper.findViewById(R.id.hListView);
SubCategoryCarouselAdapter mAdapter = new SubCategoryCarouselAdapter(getActivity(), carousel.getAssets());
horizontalList.setAdapter(mAdapter);
}
时,它会在水平和垂直方向上延迟加载图像。我已将HorizontalVariableListView与UniversalImageLoader一起用于旋转木马。
{{1}}
答案 0 :(得分:2)
为什么不使用ListView而不是ScrollView?它具有回收视图的功能,因此只对那些现在在屏幕上可见的寻呼机启动加载。否则,您应该将ScrollView子类化,以检查Pager是否立即可见
答案 1 :(得分:1)
你可以在
设置断点吗?if (image.getLocalVisibleRect(scrollBounds)) {
并查看图像和scrollBounds有哪些属性(宽度/高度/位置)?
此外,何时
private void initViews() {
称为?