Android ViewPager使用了错误的条目
我有下面的课程来展示一些图片。。。 我已经实现了将图像下载到sd卡的功能。 如果我浏览了它们,一切都很好(图片+标题显示),但是如果我从某个图片开始下载,使用了另一个url(另一个图片的url),因此我不知何故认为我的ViewPager没有正确更新或其他什么 这是我的班级:Android ViewPager使用了错误的条目,android,download,android-viewpager,Android,Download,Android Viewpager,我有下面的课程来展示一些图片。。。 我已经实现了将图像下载到sd卡的功能。 如果我浏览了它们,一切都很好(图片+标题显示),但是如果我从某个图片开始下载,使用了另一个url(另一个图片的url),因此我不知何故认为我的ViewPager没有正确更新或其他什么 这是我的班级: public class ImagePagerActivity extends BaseActivity { private ViewPager pager; LinearLayout buttonBar; TextVi
public class ImagePagerActivity extends BaseActivity {
private ViewPager pager;
LinearLayout buttonBar;
TextView txtTitle;
String urlOfImageToDownload;
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;
private static DisplayImageOptions options;
ImageView imageView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_image_pager);
Bundle bundle = getIntent().getExtras();
String[] imageUrls = bundle.getStringArray(Extra.IMAGES);
String[] imageTitles = bundle.getStringArray(Extra.TITLES);
int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
options = new DisplayImageOptions.Builder()
.cacheOnDisc().showImageForEmptyUri(R.drawable.no_image)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.build();
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new ImagePagerAdapter(imageUrls, imageTitles));
pager.setCurrentItem(pagerPosition);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (imageView.getDrawable() == null)
menu.getItem(0).setEnabled(false);
return true;
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0,
getString(R.string.save_image)).setIcon(android.R.drawable.ic_menu_save);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
Random randomGenerator = new Random();
int randomInt = 0;
for (int idx = 1; idx <= 10; ++idx) {
randomInt = randomGenerator.nextInt(100000);
}
imageView.setDrawingCacheEnabled(true);
Bitmap b = imageView.getDrawingCache();
try {
b.compress(CompressFormat.JPEG, 100,
new
FileOutputStream(Environment.getExternalStorageDirectory()
.getPath() + "/DCIM/image" + randomInt + ".jpg"));
Crouton.makeText(ImagePagerActivity.this,
"Bild erfolgreich gespeichert",
Style.INFO)
.show();
} catch (FileNotFoundException e) {
Crouton.makeText(ImagePagerActivity.this,
"Fehler beim speichern von Datei",
Style.ALERT)
.show();
}
startDownload();
return true;
}
return false;
}
private void startDownload() {
String url = urlOfImageToDownload;
Log.e(MainActivity.LOG_TAG, "url=" + urlOfImageToDownload);
new DownloadFileAsync().execute(url);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(getString(R.string.downloading_image));
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
@Override
protected void onStop() {
imageLoader.stop();
super.onStop();
}
private class ImagePagerAdapter extends PagerAdapter {
private String[] images;
private String[] titles;
private LayoutInflater inflater;
ImagePagerAdapter(String[] images, String[] imageTitles) {
this.images = images;
this.titles = imageTitles;
inflater = getLayoutInflater();
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
@Override
public void finishUpdate(View container) {
}
@Override
public int getCount() {
return images.length;
}
@Override
public Object instantiateItem(View view, int position) {
final FrameLayout imageLayout = (FrameLayout) inflater.inflate(
R.layout.item_pager_image, null);
imageView = (ImageView) imageLayout
.findViewById(R.id.image);
final ProgressBar spinner = (ProgressBar) imageLayout
.findViewById(R.id.loading);
txtTitle = (TextView) imageLayout.findViewById(R.id.txtTitle);
urlOfImageToDownload = images[position];
buttonBar = (LinearLayout) imageLayout.findViewById(R.id.buttonBar);
txtTitle.setText(titles[position]);
imageLoader.displayImage(images[position], imageView, options,
new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(FailReason failReason) {
switch (failReason) {
case IO_ERROR:
break;
case OUT_OF_MEMORY:
break;
case UNKNOWN:
break;
}
spinner.setVisibility(View.GONE);
imageView.setImageResource(android.R.drawable.ic_delete);
}
@Override
public void onLoadingComplete(Bitmap bm) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled() {
spinner.setVisibility(View.GONE);
}
});
((ViewPager) view).addView(imageLayout, 0);
return imageLayout;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View container) {
}
}
class DownloadFileAsync extends AsyncTask<String, String, String> {
@SuppressWarnings("deprecation")
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... aurl) {
int count;
try {
URL url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
Random rand = new Random();
int randomNumber = rand.nextInt(100000);
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(
"sdcard/nature_" + randomNumber + ".jpg");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress("" + (int) ((total * 100) / lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
}
return null;
}
protected void onProgressUpdate(String... progress) {
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
Crouton.makeText(ImagePagerActivity.this,
getString(R.string.image_saved),
Style.CONFIRM)
.show();
}
}
}
公共类ImagePageActivity扩展了BaseActivity{
私人寻呼机;
线性布局按钮栏;
TextView-txtTitle;
字符串urlOfImageToDownload;
公共静态最终整型对话框\u下载\u进度=0;
private ProgressDialog mProgressDialog;
私有静态显示图像选项;
图像视图图像视图;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_image_pager);
Bundle Bundle=getIntent().getExtras();
String[]imageUrls=bundle.getStringArray(Extra.IMAGES);
String[]imageTitles=bundle.getStringArray(额外的.TITLES);
int pagerPosition=bundle.getInt(Extra.IMAGE_位置,0);
选项=新建DisplayImageOptions.Builder()
.cacheOnDisc().showmageforemptyuri(R.drawable.no_图像)
.imageScaleType(imageScaleType.IN\u示例\u电源\u,共2个)
.build();
pager=(ViewPager)findViewById(R.id.pager);
setAdapter(新的ImagePagerAdapter(ImageURL,imageTitles));
pager.setCurrentItem(页面位置);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
if(imageView.getDrawable()==null)
menu.getItem(0).setEnabled(false);
返回true;
}
公共布尔onCreateOptions菜单(菜单){
菜单。添加(0,0,0,
getString(R.string.save_image)).setIcon(android.R.drawable.ic_菜单_save);
返回true;
}
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例0:
Random randomGenerator=新的Random();
int-randomInt=0;
对于(int idx=1;idx问题:
用户第一次在ViewPager中查看图像时,将调用该图像的实例化项(..)
,并将urlOfImagetoDownload
字段设置为正确的URL
:
urlOfImageToDownload = images[position];
但是,如果用户现在返回到之前已实例化的图像,则不会调用实例化项(…)
,并且urlOfImageToDownload
将保留错误的URL
(前一个图像)
解决方案:
您可以使用ViewPager#getCurrentItem()
检索当前图像的索引,然后在用户单击下载时将该索引与图像[]
一起使用,以获取正确的URL
。问题:
用户第一次在ViewPager中查看图像时,将调用该图像的实例化项(..)
,并将urlOfImagetoDownload
字段设置为正确的URL
:
urlOfImageToDownload = images[position];
但是,如果用户现在返回到之前已实例化的图像,则不会调用实例化项(…)
,并且urlOfImageToDownload
将保留错误的URL
(前一个图像)
解决方案:
您可以使用ViewPager#getCurrentItem()
检索当前图像的索引,然后将该索引与images[]
一起使用,在用户单击下载时获得正确的URL
。非常棒的答案,非常感谢!这也是一个很好的解释。谢谢!@user754730很高兴它提供了帮助:)非常棒的回答,非常感谢!这也是一个很好的解释。谢谢!@user754730很高兴它有帮助:)