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

时间:2015-07-15 11:52:02

标签: android android-asynctask android-viewpager

我有pagerAdapter通过在viewpager中滑动来快速显示图像。我想在每个gridview项目下方加载viewpager张图片。为避免在快速滑动时加载所有gridview图像,我使用OnTouchListener检测触摸事件并加载async task。问题是,当我查看viewpager时,它会创建3个viewpager页面(我用setOffscreenPageLimit限制它),left-current-right。我调用异步任务并将所有项加载到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);
    }

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您有一个GetAsyncProducts对象盲目地在某处加载数据。它与特定的GridView无关联,因此AsyncTask完成 last 将是&#34;赢得&#34;并更新GridView。由于未提供代码,因此不清楚您如何跟踪数据。我的建议是启动您的AsyncTask并将其与特定网页相关联,以便更新该特定网页的数据/ View

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