0

我的結果應該像在每個片段中顯示圖像和文本。 我在視圖中使用片段尋呼機異步任務中的刷新片段

由於圖像是高分辨率,我使用異步任務下載並保存在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); 
     } 
} 

爲downlaoding像我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; 
    }} 

請建議的方式完成我的圖片下載後刷新視圖

回答

0

i通過使用相同的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(); 
     } 
    } 
+0

這是我之前發佈的解決方案中發佈的解決方案,請驗證它 – Chetu

+0

這是不公平的。您通過複製@Chetu回覆發佈答案並標記爲已回答。你應該接受切圖的答覆。 – Mazhar

0

嘗試this.getView().draw(),如果他們不爲你工作,嘗試requestLayout()forceLayout()

+0

這.getView()。draw()函數是不存在的覆蓋和要求佈局()或強制佈局()不起作用 – Ammu

+0

你不需要重寫它就可以調用它。如果這不適合你,唯一的選擇是刪除並重新添加片段給你片段事務。事務上的提交調用將觸發片段的重新加載。 – Nazgul

+0

我試着在progressupdate中調用pageradapter.notifydatasetchanged()。它是在完成圖像下載後設置圖像,但是對於每個圖像下載,屏幕都會一直刷新,直到下載完成。 – Ammu

0

這裏的問題是尋呼機適配器沒有得到刷新。傳遞給BitmapWorkerTask的ImageView將在圖像下載後得到更新,但您必須找到一種方法來使用PagerAdapter中的notifyDataSetChanged更新pagerAdapter。首先,您需要從BitmapWorkerTask創建回調,以在下載完成後通知片段。然後你必須提供一個監聽器回你的PagerAdapter,它應該在觸發時調用notifyDataSetChanged方法。

+0

嗨,bitmapworkertest只是解碼圖像文件,這將被稱爲在片段的創建視圖中。問題是oncreateView本身沒有被調用 – Ammu

+1

onCreateView()將不會被調用,直到刷新pagerAdapter,但在前面的註釋中我看到你不想刷新onProgressUpdate中的pagerAdapter以避免在屏幕上進行多次刷新。您可以保留當前項目(Fragment)的pagerAdapter中的引用,並在需要時手動調用並更新片段中的視圖 – Chetu