【问题标题】:Refreshing fragment in Async task在异步任务中刷新片段
【发布时间】:2014-05-06 21:17:54
【问题描述】:

我的结果应该类似于在每个片段中显示图像和文本。 我在视图寻呼机中使用片段

由于图像是高分辨率的,我使用异步任务下载它并保存在 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);
        }
}

我下载图片的异步任务是

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

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

【问题讨论】:

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


    【解决方案1】:

    试试this.getView().draw(),如果他们不适合你试试requestLayout()forceLayout()

    【讨论】:

    • 这个 .getView().draw() 函数无法覆盖并且请求布局()或强制布局()不起作用
    • 你不需要重写它来调用它。如果这对您不起作用,唯一的选择是删除片段并将其重新添加到您的片段事务中。事务上的提交调用将触发片段的重新加载。
    • 我尝试在 progressupdate 中调用 pageradapter.notifydatasetchanged()。它是在完成图像下载后设置图像,但是对于每一个图像下载,屏幕都会一次又一次地刷新,直到下载完成。
    • 我也试过 private void refreshFragments(){ // WAY1 // 重新加载当前片段 /*MyGallery frg = new MyGallery();最终 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();捆绑数据 = 新捆绑(); data.putInt("current_page", pagerAdapter.currentItem()); frg.setArguments(数据);英尺分离(FRG); ft.attach(frg); ft.commit();*/ //方式 2 //pagerAdapter.notifyDataSetChanged(); // 方式 3 //pagerAdapter.getItem(MyGalleryPagerAdapter.mCurrentPage); }
    • 好的,如果 notifyDataSetChanged 适合您,那么请尝试这样做。不要为每个图像下载创建一个新的异步任务,而是尝试批量执行它们。我有类似的问题,但数据不是图像。我将我的列表视图设计为一次加载 8 行,并且在一个加载器中将所有 8 行作为批处理。并且性能大幅提升。
    【解决方案2】:

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

    【讨论】:

    • 您好,bitmapworkertest 仅用于解码图像文件,将在片段的 oncreateview 中调用。问题是 oncreateView 本身没有被调用
    • onCreateView() 在 pagerAdapter 刷新之前不会被调用,但在之前的评论中我看到你不想在 onProgressUpdate 中刷新 pagerAdapter 以避免屏幕上的多次刷新。您可以在 pagerAdapter 中保留当前项目(Fragment)的引用,并在需要时手动调用并更新 Fragment 中的视图
    【解决方案3】:

    我通过使用相同的 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();
            }
        }
    

    【讨论】:

    • 这是我之前帖子中发布的解决方案,请验证它
    • 这不公平。您通过复制@Chetu 回复发布了答案并标记为已回答。你应该已经接受了切图的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多