在 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
并将其与特定页面相关联,以便更新该特定页面的数据/View
s.
您还需要确保跟踪不同的 AsyncTask
对象实例,以便在页面快速关闭或您的 Activity
/Fragment
时取消它们进入暂停状态。否则,您的 AsyncTask
s 可能会不必要地继续工作,或者(更糟糕的是)尝试在暂停后更新 View
s,从而导致您的应用程序崩溃。
我有 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
并将其与特定页面相关联,以便更新该特定页面的数据/View
s.
您还需要确保跟踪不同的 AsyncTask
对象实例,以便在页面快速关闭或您的 Activity
/Fragment
时取消它们进入暂停状态。否则,您的 AsyncTask
s 可能会不必要地继续工作,或者(更糟糕的是)尝试在暂停后更新 View
s,从而导致您的应用程序崩溃。