簡體   English   中英

刷新異步任務中的片段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM