[英]Refreshing fragment in Async task
我的結果應該像在每個片段中顯示圖像和文本一樣。 我在視圖尋呼機中使用片段
由於圖像是高分辨率的,因此我正在使用異步任務下載它並保存在sdcard中。
如果下載了圖像,則我的代碼正常運行;如果圖像不存在,則在下載圖像后,片段不會刷新,因此圖像也不會顯示。 完成圖像下載后如何刷新片段。
我在活動中設置片段的代碼是
ExtendedViewPager pager = (ExtendedViewPager) findViewById(R.id.view_pager);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
pagerAdapter = new MyGalleryPagerAdapter(fm,eventArrayList);
/** Setting the pagerAdapter to the pager object */
pager.setAdapter(pagerAdapter);
pager.setOnPageChangeListener(new MyPageChangeListener());
pager.setCurrentItem(currentpage);
我的適配器代碼是
public class MyGalleryPagerAdapter extends FragmentStatePagerAdapter implements{
public static int mCurrentPage;
/** Constructor of the class
* @param eventArrayList */
ArrayList<EventsGalleryDetails> events;
public MyGalleryPagerAdapter(FragmentManager fm, ArrayList<EventsGalleryDetails> eventArrayList) {
super(fm);
events=eventArrayList;
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
System.out.println("Get Item");
MyGallery myFragment = new MyGallery();
Bundle data = new Bundle();
data.putInt("current_page", arg0);
myFragment.setArguments(data);
mCurrentPage = arg0;
return myFragment;
}
public int currentItem(){
return mCurrentPage;
}
public int getItemPosition(Object item) {
return POSITION_NONE;
}
/** Returns the number of pages */
@Override
public int getCount() {
return events.size();
}
我的片段代碼是
public class MyGallery extends Fragment implements OnPageChangeListener{
ImageLoader imageLoader;
int mCurrentPage;
Bitmap bm ;
public static final String TAG = "MyGallery";
private LruCache<String, Bitmap> mMemoryCache;
private HashMap<Integer, TouchImageView>hmap = new HashMap<Integer, TouchImageView>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
imageLoader=new ImageLoader(getActivity());
Bundle data = getArguments();
mCurrentPage = data.getInt("current_page", 0);
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle data = getArguments();
mCurrentPage = data.getInt("current_page", 0);
View v = inflater.inflate(R.layout.gallerysecondscreenitem, container,false);
TouchImageView img = (TouchImageView)v.findViewById(R.id.galleryimage);
TextView txt = (TextView ) v.findViewById(R.id.gallerytext);
hmap.put(mCurrentPage, img);
if(new File(Constants.Path+".jpg").exists()){
loadBitmap(img);
bm = null;
img = null;
}else{
img.setImageResource(R.drawable.gallery_icon);
}
txt.setText(GallerySecondScreen.eventArrayList.get(mCurrentPage).getTitle());
return v;
}
public void loadBitmap(TouchImageView mImageView) {
final String imageKey = String.valueOf(mCurrentPage);
final Bitmap bitmap = mMemoryCache.get(imageKey);
if (bitmap != null) {
mImageView.setImageBitmap(bitmap);
} else {
mImageView.setImageResource(R.drawable.gallery_icon);
BitmapWorkerTask task = new BitmapWorkerTask();
task.execute(mImageView);
}
}
我對圖像進行非常規的asyc任務是
private class DownloadImageTask extends AsyncTask<Integer, Integer, Integer>{
@Override
protected Integer doInBackground(Integer... values) {
try {
for(int j=0;j<eventArrayList.size();j++){
if(!new File(Constants.Path+".jpg").exists()){
downloadImageFromServer(eventArrayList.get(j).getImage(), ""+pos,""+j);
publishProgress(j);
//Log.d("Image will be downloaded from server now..", "the "+values[0]);
}else{
publishProgress(j);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("value of j:",""+j);
return j;
}}
完成圖片下載后,請提出一種刷新視圖的方法
如果它們對您不起作用,請嘗試forceLayout()
this.getView().draw()
嘗試requestLayout()
或forceLayout()
這里的問題是尋呼機適配器沒有刷新。 下載圖像后,傳遞給BitmapWorkerTask的ImageView將得到更新,但是您必須找到一種使用PagerAdapter中的notifyDataSetChanged更新pagerAdapter的方法。 首先,您需要從BitmapWorkerTask創建回調,以在下載完成后通知片段。 然后,您必須向PagerAdapter提供一個偵聽器,該偵聽器一旦被觸發,就應調用notifyDataSetChanged方法。
我通過使用相同的pageradpter.notifydatasetchanged()解決了該問題。 並非每次都調用它,而是僅在下載當前視圖的圖像時才調用
這是我修改的OnprogressUpdate
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
System.out.println("Downloaded "+values[0]);
if(values[0] == mPager.mCurrentPage){
pagerAdapter.notifyDataSetChanged();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.