【问题标题】:ViewPager Is Not Scrolling SmoothlyViewPager 滚动不顺畅
【发布时间】:2015-04-24 16:24:00
【问题描述】:

我在我的活动中实现了一个 viewpager,它在滚动时将一组数据加载到适配器并在列表视图中显示它们。一切正常,但我似乎不知道如何提高效率,因为滚动时,视图会冻结,但例如在 GMAIL 应用程序中,当在电子邮件之间滚动时,滚动非常流畅。

下面是我正在使用的代码:

活动:

在创建时

pageradapter adapter2 = new pageradapter(this, ArrayOfItems);   //ArrayOfItems is an Array containing the data that will be displayed
        ViewPager myPager = (ViewPager) findViewById(R.id.mypanelpager);
        myPager.setAdapter(adapter2);
pagechangelistener pageListener = new pagechangelistener();
        myPager.setOnPageChangeListener(pageListener);

页面适配器:

public pageradapter(Activity act, ArrayList <List<Item>>Arrayitems) {
    this.Arrayitems = Arrayitems;
    activity = act;
}

public int getCount() {
    return Arrayitems.size();
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    List<Item> item = Arrayitems.get(position);
    ListView view = new ListView(activity);
    taskdetailsarrayadaptertest adapter = new taskdetailsarrayadaptertest(activity, item);
    view.setAdapter(adapter);
    view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
    ((ViewPager) container).addView(view, 0);
    return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((View) object);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);
}

@Override
public Parcelable saveState() {
    return null;
}

pagechangelistener:

@Override
public void onPageSelected(int position)
{
    currentPage = position;
    int positionTemp = position + 1;
}

public final int getCurrentPage() {
    return currentPage;
}

【问题讨论】:

  • 感谢您的快速响应,但您认为我的代码高效吗?
  • 您是否正确处理列表视图中的加载数据,我的意思是在后台进行?因为你的代码看起来不错并且不能滞后,除非列表视图本身有滞后。
  • 你的代码看起来不错。
  • 在 oncreate 时(一次)正在加载数据。你的意思是我应该在滚动时动态加载数据吗?

标签: android android-viewpager


【解决方案1】:

首先你需要使用这样的支架。

在您的 ViewPager 中:

class Holder{
    ListView listView;
    Adapter adapter;
}

private ArrayList<Holder> mHolders;

//init holders

@Override
public Object instantiateItem(ViewGroup collection, int position) {
    Holder holder = mHolders.get(position);
    holder.listView.setAdapter(holder.adapter);
    collection.addView(holder.listView);
    return holder.listView;
}

第二次尝试在listview中异步加载数据

【讨论】:

  • 我应该在 instantiateItem 方法中加载异步任务吗?因为我试过了,然后我得到了一个空指针异常,因为在异步任务完成之前正在执行 return 语句。
  • 你应该在listview的适配器中使用asynctask来加载listview中的数据
【解决方案2】:

设置 myPager.setOffscreenPageLimit(1);

【讨论】:

  • 这有助于但没有消除问题
  • 你在 ViewPager 中加载图像吗?
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多