Utworzono działanie, które używa FragmentStatePagerAdapter
, aby zapewnić małą galerię. Jednak nie mogę go odświeżyć, gdy aktywność zostanie wznowiona (na przykład po powrocie z innej aktywności). Za każdym razem, gdy pierwsze dwa zdjęcia będą puste i dopiero po przesunięciu dwóch obrazów na bok, zostaną odświeżone. Żadna z odpowiedzi nie znalazłem pracę (zwłaszcza nadrzędnych getItemPosition()
)Odśwież obrazy w FragmentStatePagerAdapter o wznowieniu aktywności
ustawić go tak:
mPagerAdapter = new PhotosPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.photosViewPager);
mPager.setAdapter(mPagerAdapter);
Wtedy mam FragmentStatePagerAdapter Klasa:
private class PhotosPagerAdapter extends FragmentStatePagerAdapter{
public PhotosPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return photos.size();
}
@Override
public Fragment getItem(int position) {
ImageFragment f = new ImageFragment(position);
return f;
}
@Override
public int getItemPosition(Object object) {
throw new RuntimeException();
//return POSITION_NONE;
}
}
Jak zapewne zauważyliście, Rzucam RuntimeException w getItemPosition, ponieważ chciałem sprawdzić, kiedy zostanie wywołany. I nie jest wywoływana, dopóki nie dodaję czegoś do listy zawierającej moje zdjęcia. Następnie ImageFragment klasa:
public class ImageFragment extends Fragment{
int position;
Bitmap mBitmap;
int width;
int height;
ImageView img;
public ImageFragment(){
}
public ImageFragment(int position){
this.position = position;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
img = new ImageView(container.getContext());
img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
width = container.getWidth();
height = container.getHeight();
loadBitmap();
return img;
}
public void loadBitmap(){
if (img == null){
return;
}
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(photos.get(position), options);
options.inSampleSize = calculateInSampleSize(options, width/2, height/2);
options.inJustDecodeBounds = false;
mBitmap = BitmapFactory
.decodeFile(photos.get(position), options);
img.setImageBitmap(mBitmap);
}
@Override
public void onDestroyView() {
mBitmap.recycle();
super.onDestroyView();
}
}
Code jest trochę brudny po tym, jak próbował to naprawić ... Ale: usuwanie onDestroyView()
nie działa. Umieściłem mPagerAdapter.notifyDataSetChanged()
w kilku miejscach, które muszą zostać wywołane (jak onResume()
), bez rezultatu. Trochę z tym rozpaczliwie.
Jesteś geniuszem! Cały dzień próbowałem wszystkiego, ale to zadziałało idealnie! –
Działa zgodnie z wywołaniem adaptera notifyDataSetChanged(). – user465363