在ScrollView中延迟加载ViewPagers

时间:2014-02-06 02:06:04

标签: android listview android-viewpager scrollview lazy-loading

我试图将多个ViewPagers充气到ScrollView,其中每个ViewPager正在使用FragmentStatePagerAdapter。

ViewPager由每个页面包含三个ImageViews的片段组成。

我使用UniversalImageLoader进行图像的异步加载,但是我无法使用懒惰的加载工作。

问题是,当我的应用程序正在膨胀时,可以为每个ViewPagers设置10个ImageViews,其中TripplePosterFragment1ViewPagers,另外10个ImageViewsTripplePosterFragment2mPager.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

更新

与以前相同的核心问题,但是使用了一种新方法Horizo​​ntalListViews 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); } 时,它会在水平和垂直方向上延迟加载图像。我已将HorizontalVariableListViewUniversalImageLoader一起用于旋转木马。

{{1}}

2 个答案:

答案 0 :(得分:2)

为什么不使用ListView而不是ScrollView?它具有回收视图的功能,因此只对那些现在在屏幕上可见的寻呼机启动加载。否则,您应该将ScrollView子类化,以检查Pager是否立即可见

答案 1 :(得分:1)

你可以在

设置断点吗?
if (image.getLocalVisibleRect(scrollBounds)) {

并查看图像和scrollBounds有哪些属性(宽度/高度/位置)?

此外,何时

private void initViews() {

称为?