Android ImageView循环显示,但是就显示最后一张

getAllImageName()方法是获得SD卡上的所有图片 30张,然后for循环中String filePath=AsyncImageLoader.path+"/"+list.get(i); 是获得图片的具体路径,想在点击Btn_play_ClickEvent按钮事件,在ImageView中循环显示这些图片,截图的方法只是显示最后一张,求解怎么实现循环显示!!!!

2个回答

需要异步加载图片,不然它会在完全循环结束后才更新UI,也就是永远是最后一张。

你应该使用AsyncTask

[list]
[*]在doInBackground里面加载。
[*]在onPostExecute里设置图片。
[/list]

http://developer.android.com/reference/android/os/AsyncTask.html

yangfeixien
杨_飞 解决了 优化了代码
6 年多之前 回复
j_clxy
clxy大叔 代码没看出问题。
6 年多之前 回复
yangfeixien
杨_飞 AsyncTask 实现类 doInBackground 方法中调用 backGroundSaveImg方法,发现程序有些卡死。 private static void backGroundSaveImg(){ List<String> list = WeatherDao.getQxtOptions(); for (int i = 0; i < list.size(); i++) { //执行文件的读写 SaveImg.SaveImg(WeatherDao.getImgUrl(list.get(i))); } }
6 年多之前 回复
j_clxy
clxy大叔 那不要用两个。 用你最初的设计,遍历时,如果没有去下载,有的话从SD读取。 这个逻辑写在一个AsyncTask里好了。 可以分成两个Service,但是放进一个AsyncTask。
6 年多之前 回复
yangfeixien
杨_飞 new ExecuteSaveWebImgToSDCard().execute(null,null,null);这个在创建Activity的时候执行的保存网络图片方法。 有个按钮也是类似,就是上边你写的那种new ExecuteChangeImg().execute(null, null, null); 但是如此以来,一个页面有两个AsyncTask实现类执行的话,只执行保存图片的那个,另外一个不执行了。求教!
6 年多之前 回复
j_clxy
clxy大叔 [quote]Thread+Runnable[/quote] 是的。Android自己提供了Handler和AsyncTask这两个,方便些。 [quote]如何按开始按钮开始,按结束按钮结束[/quote] 开始就是现在这样,结束就是在你的for循环中加判断类似 [code="java"] if(isCanceling) { return "用户取消!"; } [/code] 按结束,则设置isCnaceling=true就好。 [quote]循环过程中如果没有图片则下载下来[/quote] 这个不懂!现在是用默认图片代替的意思?那样的话,提供URL,然后后台下载好了。Android上下载图片的例子也有很多。 Android,我刚刚开始学习不久(很久以前碰过倒是,很久很久以前)。
6 年多之前 回复
yangfeixien
杨_飞 其实我用Thread+Runnable实现了,不过感觉很不科学,没你这种好,所以,采纳你推荐的这个类,初学者,问题较多,还望多多指教。 你的那些可以正常运行,多谢。不过有如下问题想请教,或者方便加你个联系方式不? 1.如何按开始按钮开始,按结束按钮结束 2.循环过程中如果没有图片则下载下来
6 年多之前 回复
j_clxy
clxy大叔 还是不对,这回是终极版本了,哈哈。(因为没有环境,不好意思!) [code="java"] class Btn_play_ClickEvent implements OnClickListener { @Override public void onClick(View arg0) { try { new ExecuteChangeImg().execute(null, null, null); } catch (Exception e) { HLog.writeLog(HLog.ERROR, e.getMessage()); } } } class ExecuteChangeImg extends AsyncTask<String, Bitmap, String> { @Override protected String doInBackground(String... params) { List<String> list = WeatherDao.getAllImageName(); for (String s : list) { String filePath = AsyncImageLoader.path + "/" + s; File file = new File(filePath); if (!file.exists()) { filePath = AsyncImageLoader.DefaultImg; } Bitmap bmp = BitmapFactory.decodeFile(filePath); publishProgress(bmp); } return "全部结束!"; } protected void onProgressUpdate(Bitmap... bitmap) { imageView.setImageBitmap(bitmap[0]); } } [/code]
6 年多之前 回复
j_clxy
clxy大叔 都搬进去,外面别留。做内部类好些。 另外,我说错了:应该是onProgressUpdate,不是onPostExcecute<-这个是最后结束。 [code="java"] class Btn_play_ClickEvent implements OnClickListener { @Override public void onClick(View arg0) { try { new ExecuteChangeImg().execute(filePath, null, null); Thread.sleep(1000); } catch (InterruptedException e) { HLog.writeLog(HLog.ERROR, e.getMessage()); } } } class ExecuteChangeImg extends AsyncTask<String, Bitmap, String> { @Override protected Bitmap doInBackground(String... filePaths) { List<String> list = WeatherDao.getAllImageName(); for (int i = 0; i < list.size(); i++) { String filePath = AsyncImageLoader.path + "/" + list.get(i); File file = new File(filePath); if (!file.exists()) { filePath = AsyncImageLoader.DefaultImg; } } Bitmap bmp = BitmapFactory.decodeFile(filePaths[0]); return bmp; } protected void onProgressUpdate(Bitmap... bitmap) { imageView.setImageBitmap(bitmap[0]); } } [/code]
6 年多之前 回复
yangfeixien
杨_飞 class Btn_play_ClickEvent implements OnClickListener { @Override public void onClick(View arg0) { List<String> list=WeatherDao.getAllImageName(); for(int i=0;i<list.size();i++){ String filePath=AsyncImageLoader.path+"/"+list.get(i); File file=new File(filePath); if(!file.exists()){ filePath=AsyncImageLoader.DefaultImg; } try { new ExecuteChangeImg().execute(filePath,null,null); Thread.sleep(1000); } catch (InterruptedException e) { HLog.writeLog(HLog.ERROR, e.getMessage()); } } } } class ExecuteChangeImg extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... filePaths) { Bitmap bmp = BitmapFactory.decodeFile(filePaths[0]); return bmp; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); imageView.setImageBitmap(bitmap); } } -------------------------------- 怎么不行呢?
6 年多之前 回复

上面的代码copy了你的,还没改好。请无视。

[code="java"]
class Btn_play_ClickEvent implements OnClickListener {
@Override
public void onClick(View arg0) {
try {
new ExecuteChangeImg().execute(null, null, null);
Thread.sleep(1000);
} catch (InterruptedException e) {
HLog.writeLog(HLog.ERROR, e.getMessage());
}
}
}

class ExecuteChangeImg extends AsyncTask {
@Override
protected String doInBackground(String... filePaths) {
List list = WeatherDao.getAllImageName();
for (int i = 0; i < list.size(); i++) {
String filePath = AsyncImageLoader.path + "/" + list.get(i);
File file = new File(filePath);
if (!file.exists()) {
filePath = AsyncImageLoader.DefaultImg;
}
Bitmap bmp = BitmapFactory.decodeFile(filePath);
publishProgress(bmp);
}
return "全部结束!";
}

protected void onProgressUpdate(Bitmap... bitmap) {
    imageView.setImageBitmap(bitmap[0]);
}

}
[/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问