在 instantiateItem 中具有异步任务的 PagerAdapter-Viewpager 在最后创建的页面上加载产品

PagerAdapter-Viewpager with async task in instantiateItem loads products on the last created page

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

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

这里是instantiateItem:

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

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

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