我需要一个查看分页器实现的解决方案。 首先,我在单页中从数据库加载大量数据,因此有时在刷卡过程中它会减慢刷卡频率(需要在页面上多次刷卡),就像在后台执行提取任务一样。 我没有使用异步任务返回视图。 是否有任何方法来延迟加载页面只允许用户在刷卡上转到其他页面但数据是延迟加载的。
我的代码示例如下;public Object instantiateItem(View container, int position) { View v; v = View.inflate(context,R.layout.swipearea, null); listView = (ListView)v.findViewById(R.id.MyListView); largeDataCall(); ((ViewPager)container).addView(v); return v; }
我在create方法中调用它。
pager=(ViewPager) findViewById(R.id.pagerAdapter); pager.setAdapter(new SimplePager(MyPager.this)); pager.setCurrentItem(364);
有什么解决方案吗?
我建议使用Fragments(而不是直接使用视图)。
您需要在片段上使用接口来告诉它们何时显示:
public interface IShowedFragment { public void onShowedFragment(); }
使所有片段实现该接口,并在该方法中调用您的loaders / asyncTasks / background任务。
然后在ViewPager上放置一个onPageChangeListener,当您检测到用户更改了页面时,请调用片段上的接口方法。 您可以选择使用此侦听器,其中一种方法是等待viewPager停止滑动以触发接口调用。
为了能够获得正确的片段来进行此调用,请从yourFragmentApadter.instantiateItem(ViewGroup,int)中获取片段,如果片段已经加载,它将返回该片段的片段。
mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position); if(fragment instanceof IShowedFragment){ ((IShowedFragment) fragment).onShowedFragment(); } } (...)
就像那样,您可以使用空视图准备片段,当您在其中滑动时,您开始加载数据。
我刚刚完成了一项非常类似的任务。 为了让您开始寻找问题的解决方案,请按顺序考虑以下几点;
看看你是否需要在第一个实例中获取所有数据。 您可以随意回复一些详细信息,了解您需要加载哪些信息以及您正在使用它做什么(在屏幕上将其显示为列表?)
查看使用CursorLoader ,它执行繁重的任务,例如异步数据库提取。 关于interwebs的本教程介绍了ContentProvider Android方法。 最好熟悉官方的Android URI和ContentProvider文档,如果这些条款没有多大意义的话。
如果您正在使用Fragments – 请查看使用FragmentStatePagerAdapter而不是传统的FragmentPagerAdapter 。 我没有使用过这个适配器,但我已经读过它只实例化当前可见的片段,即不是当前所选标签右侧或左侧的那些片段。
查看优化您针对数据库运行的查询。
当ViewPager即将交换并需要视图时,将调用instantiateItem 。 它不必实际创建所有内容。 我认为最终,懒惰加载已经结束。 我看待它的方式,你需要在这里做两件事。
1:当用户即将到达您的页面时,在后台缓存数据。 你的例子声称有364页(好主),所以我会说使用一个监听器来处理页面更改。 当您在第363页时,开始加载364的数据。当您处于364时,开始在365处加载数据并将数据保持在363以防用户想要交换回来。 如果数据加载速度相对较快或者用户需要很长时间才能进行交换,那么假设您使用asyncTask或线程加载数据应该是无用的。
2:备份默认视图在检索数据之前不会填充。 如果用户在检索数据之前加载页面,您还需要使用选项1执行此操作。 基本上,只有一个视图说“加载……”或其他东西,直到你有数据。 要么是这样,要么在获得数据时实时填充数据。 在这种情况下,用户将看到它构建。
无论哪种方式,我认为你需要缓存一些东西,以使应用程序看起来很好。
我有类似的问题。 正在加载大量数据的viewpager。 如果您不打算经常更改各个页面的视图,那么我建议您将页面保留在内存中。 使用以下代码执行此操作
mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4.
如果要刷新viewpager幻灯片上的数据,请使用
mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE.
并使用FragmentStatePagerAdapter。
我认为没有任何方法可以以您描述的同步方式延迟加载数据。 AsyncTask是要走的路,或者你可以直接使用线程。 我相信AsyncTask是专门为这种function而设计的。 直接使用线程更容易。 如果您需要有关实施的想法,请查看: http : //geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/
你看过android点火库吗? 根据Sample-applications,有一个组件“Endless List”和一个http-cache组件。
我自己没试过,也不知道这是否适合你 – 只是看了一些例子……