【问题标题】:PagerAdapter-Viewpager with async task in instantiateItem loads products on the last created page在 instanceiteItem 中具有异步任务的 PagerAdapter-Viewpager 在最后创建的页面上加载产品
【发布时间】:2015-07-15 11:52:01
【问题描述】:

我有pagerAdapter 可以通过在viewpager 中滑动来快速显示图像。我想在每个viewpager 项目下方加载gridview 图像。为了避免在快速滑动时加载所有gridview 图像,我使用OnTouchListener 来检测触摸事件并加载async task。问题是当我打开 viewpager 时,它会创建 3 个 viewpager 页面(我用setOffscreenPageLimit 限制它),left-current-right。我调用异步任务并将所有项目加载到gridview,但gridview 图像未显示current viewpager page,因为它在最后创建的viewpager 页面上加载gridview 图像。

如何将异步任务图像添加到当前的 viewpager 项目?我的逻辑错了吗?你能提出一些建议来实现这一目标吗? 感谢您的关注。

这里是实例化项目:

@Override
public Object instantiateItem(ViewGroup container, int position) {
    inflater = (LayoutInflater) container.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.detail, container, false);

mGridView = (ExpandableHeightGridView)view.findViewById(R.id.product);
mGridView.setExpanded(true);

scrollView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getActionMasked();
                switch (action) {

                case MotionEvent.ACTION_DOWN:
                    initialY = event.getY();
                    break;

                case MotionEvent.ACTION_MOVE:
                    break;

                case MotionEvent.ACTION_UP:
                    float finalY = event.getY();
                    if (initialY < finalY | initialY > finalY) {
                        if(!asyncTaskCalled){
                            new GetAsyncProducts().execute();
                            asyncTaskCalled=true;
                        }
                    }

                    break;

                case MotionEvent.ACTION_CANCEL:
                    break;

                case MotionEvent.ACTION_OUTSIDE:
                    break;
            }
                return false;
            }
        });

}

异步进程:

  @Override
    protected void onPreExecute(){
        GetProducts.productID = list_pk.get(viewPager.getCurrentItem()); 
        new GetProducts(); // This is service and gets products.
    }
    @Override
    protected void onPostExecute(View result) {
        listproducts.addAll(GetProducts.list_products);
        imgAdapter = new ImageAdapter(); // GridView Adapter
        mGridView.setAdapter(imgAdapter);
        imgAdapter.notifyDataSetChanged();
        super.onPostExecute(result);
    }

【问题讨论】:

  • 您能提供GetAsyncProudcts 类的代码吗?另外,澄清一下:您有 3 个单独的 gridvews,每页一个?
  • 不,一页有一个 GridView(如果用户一一触摸所有页面)。我添加了异步任务流程。请参阅编辑。

标签: android android-asynctask android-viewpager


【解决方案1】:

发生这种情况是因为您有一个GetAsyncProducts 对象在某处 盲目地加载数据。它与特定的GridView 无关,因此无论哪个AsyncTask 完成最后,都将是“获胜”并更新GridView 的那个。由于未提供代码,因此不清楚您如何跟踪数据。我的建议是启动您的 AsyncTask 并将其与特定页面相关联,以便更新该特定页面的数据/Views。

您还需要确保跟踪不同的AsyncTask 对象实例,以便在页面被快速关闭或Activity/Fragment 进入暂停状态时取消它们。否则,您的 AsyncTasks 最终可能会继续不必要地工作,或者(更糟糕的是)尝试在暂停后更新 Views,从而导致您的应用崩溃。

【讨论】:

  • 嗨拉里。抱歉回复晚了。你的回答对我帮助很大。我用viewHolder 解决了我的问题,它分别保存了我的视图,所以我更新了我想要的视图。我接受你的回答,因为你的回答是我的指南。
  • 谢谢你,很高兴你能解决这个问题!
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多