9

我需要一个视图寻呼机实现的解决方案。首先,我在单页中从数据库中加载大量数据,因此有时在滑动期间它会减慢滑动频率(您需要在页面上多次滑动),因为它在后台执行获取任务。我没有使用异步任务来返回视图。有什么方法可以延迟加载页面,只允许用户在滑动时进入其他页面,但数据是延迟加载的。

我的代码示例如下;

 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;
}

我在创建方法中调用它。

pager=(ViewPager) findViewById(R.id.pagerAdapter);
pager.setAdapter(new SimplePager(MyPager.this));
pager.setCurrentItem(364);

有什么解决办法吗?

4

6 回答 6

17

我建议使用片段(而不是直接使用视图)。

您需要片段上的接口来告诉它们何时显示:

public interface IShowedFragment {

    public void onShowedFragment();
}

让你的所有片段都实现那个接口,并在那个方法中调用你的加载器/异步任务/后台任务。

然后在你的ViewPager上放一个onPageChangeListener,当你检测到用户改变了页面时,调用你的fragment上的接口方法。您可以使用此侦听器进行一些选择,其中一种方法可以等待 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();
      }
  }
  (...)

像这样,您可以使用空视图准备片段,当您在其中滑动时,您开始加载数据。

于 2012-05-22T13:45:40.287 回答
3

我刚刚完成了一个非常相似的任务。为了让您开始寻找问题的解决方案,请按顺序考虑以下几点;

  1. 看看您是否需要在第一个实例中获取所有这些数据。随时回帖详细说明您需要加载哪些信息以及您正在使用它做什么(将其显示为屏幕上的列表?)
  2. 看看 using CursorLoaders 执行繁重的任务,例如异步获取数据库。互联网上的本教程介绍了 ContentProvider Android 方法。如果这些术语意义不大,最好熟悉官方的 Android URI 和 ContentProvider 文档。
  3. 如果您正在使用 Fragments - 看看使用FragmentStatePagerAdapter而不是传统的FragmentPagerAdapter. 我没有使用过这个适配器,但我读到它只实例化当前可见的片段,即不是当前选定选项卡右侧或左侧的那些片段。
  4. 查看优化您对数据库运行的查询。
于 2012-05-22T14:29:01.910 回答
1

instantiateItem is called when the ViewPager is about to swap and needs a view. It doesn't have to actually create everything. I think ultimately, lazy-loading is out. The way I see it, there's two things you'll need to do here.

1: Cache the data in the background when the user is about to reach your page. Your example claims that 364 pages (good Lord), so I'd say use a listener to handle page changes. When you're at page 363, start loading the data for 364. When you're at 364, start loading the data at 365 and keep the data at 363 in case the user wants to swap back. If the data loads relatively quickly or the user takes a long time to swap, it should be seemless assuming you're using asyncTask or thread to load the data.

2: Have a backup default view that doesn't get populated until the data is retrieved. You'll need to do this with option 1 as well in case the user loads the page before you retrieve the data. Basically, just have a view that says "loading..." or something until you have the data. Either that, or populate the data at real time as you get it. In that case the user will see it build.

Either way, I think you'll need to cache something to make the app look good.

于 2012-05-22T13:47:54.233 回答
1

我有一个类似的问题。正在加载大量数据的浏览器。如果您不打算经常更改各个页面的视图,那么我建议您将这些页面保留在内存中。使用以下代码执行此操作

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。

于 2013-01-30T16:18:13.653 回答
0

你看过android点火库吗?根据Sample-applications有一个组件“无尽列表”和一个 http-cache 组件。

我自己没有尝试过,不知道这是否适合你 - 只是看到了例子......

于 2012-05-22T13:56:20.183 回答
0

我认为没有任何方法可以以您描述的同步方式延迟加载数据。AsyncTask 是要走的路,或者您可以直接使用线程。我相信 AsyncTask 是专门为这种功能设计的。它比直接使用线程更容易。如果您需要有关实施的想法,请查看: http: //geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

于 2012-05-22T13:36:35.737 回答