在异步任务中刷新片段

时间:2014-05-06 12:18:38

标签: android android-fragments android-asynctask android-viewpager

我的结果应该像在每个片段中显示图像和文字一样。 我在视图寻呼机中使用片段

由于图像是高分辨率,我使用异步任务下载并保存在SD卡中。

如果下载图像,我的代码工作正常,如果图像不存在,则在下载图像后,片段不会刷新,因此图像不会显示。如何在完成图像下载后刷新片段。

我在设置片段的活动中的代码是

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

请在完成我的图片下载后建议一种刷新视图的方法

3 个答案:

答案 0 :(得分:0)

如果他们不适合您,请尝试this.getView().draw()requestLayout()

答案 1 :(得分:0)

这里的问题是寻呼机适配器没有刷新。传递给BitmapWorkerTask的ImageView将在下载图像后得到更新,但您必须找到一种方法来使用PagerAdapter中的notifyDataSetChanged更新pagerAdapter。首先,您需要从BitmapWorkerTask创建Callback,以便在下载完成后通知片段。然后你必须向你的PagerAdapter提供一个监听器,它应该在触发后调用notifyDataSetChanged方法。

答案 2 :(得分:0)

我通过使用相同的pagesradpter.notifydatasetchanged()解决了这个问题。而不是每次都调用它,我只在下载当前视图的图像时调用

这是我修改过的OnprogressUpdate

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        System.out.println("Downloaded "+values[0]);
        if(values[0] == mPager.mCurrentPage){
            pagerAdapter.notifyDataSetChanged();
        }
    }