[英]Asynchronously load images into ViewPager
我正在尝试使用ViewPager进行幻灯片放映。 我想访问保管箱以下载图像,然后将其加载到片段中。 我在片段内使用异步任务来获取图像,然后在onPostExecute上将图像加载到imageView中。 问题在于图像只是不显示。 我想AsyncTask无法更新片段内容,或者当我返回rootView时,它不再更新。 您能建议我任何解决方案吗? 我感谢您的帮助!
ScreenSlideShowActivity2
public class SlideShowActivity2 extends FragmentActivity {
private static final int NUM_PAGES = 5;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
List<DropboxAPI.Entry> content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_slide_show_activity2);
content = AlbumAdapterDropbox.choosenAlbum.getContent();
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
}
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
Bundle bundle = new Bundle();
bundle.putString("url", content.get(position).path);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return content.size();
}
}
ScreenSlidePageFragment
public class ScreenSlidePageFragment extends Fragment {
ImageView imageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle bundle = getArguments();
String url = bundle.getString("url");
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_screen_slide_page, container, false);
imageView = (ImageView) rootView.findViewById(R.id.contentImageView);
Picasso.with(getActivity().getApplicationContext()).load(R.drawable.img2).into(imageView);
File file = new File(getActivity().getCacheDir().getAbsolutePath() + "/" + url);
String p;
if (!file.exists()) {
DownloadImage task = new DownloadImage();
task.execute(url);
try {
p = task.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
} else {
Picasso.with(getActivity().getApplicationContext()).load(file).into(imageView);
}
return rootView;
}
private class DownloadImage extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
android.os.Debug.waitForDebugger();
String cachePath = null;
try {
DropboxAPI.Entry e = MainActivity.mApi.metadata(strings[0], 1, null, false, null);
FileOutputStream mFos;
if (e.isDir || e.contents == null) {
return null;
}
cachePath = getActivity().getCacheDir().getAbsolutePath() + "/" + e.fileName();
try {
mFos = new FileOutputStream(cachePath);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
return null;
}
MainActivity.mApi.getFile(e.path, null, mFos, null);
Log.i(DownloadImageTask.class.getName(), e.fileName());
} catch (DropboxException e) {
e.printStackTrace();
}
return cachePath;
}
@Override
protected void onPostExecute(String string) {
Picasso.with(getActivity().getApplicationContext()).load(string).into(imageView);
super.onPostExecute(string);
}
}
}
如果您使用picassa,则无需再次使用asynctask。 Picassa会照顾好它。 这是两个链接: http : //code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
http://themakeinfo.com/2015/04/android-retrofit-images-tutorial/
在if语句中,您可以执行以下操作:
Picasso.with(context).load("your url stirng").into(imageView);
删除Asynctask部分。 您不再需要它了。 如果有帮助,我会很高兴。 我不是那个专家。 希望有人能提供最好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.