我有一个Activity,它持有一个TabHolder。每个标签都是片段。
其中一个标签有一个ListView,应该用照片和文字来实现。问题是,当我点击选项卡时,UI需要一段时间才能加载,因为我必须通过URI获取照片,将位图的大小调整为ListView中适配器中的ImageView,然后显示它。我想将照片加载到一个帖子中,并在照片加载时向用户显示ProgressDialog。但我不知道在哪里!如果我在适配器中的getView方法中执行它,它开始表现得很奇怪,因为它被调用的次数与数组中的照片一样多...尝试在片段内的OnCreateView()中执行此操作:
adapter=new FotoAdapter(getActivity(), arrayFotos);
final ProgressDialog dialog=ProgressDialog.show(getActivity(), getString(R.string.onemoment), getString(R.string.fotoloading));
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
dialog.dismiss();
}
}
};
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
listaFotos.setAdapter(adapter);
Message message=new Message();
message.what=1;
handler.sendMessage(message);
}
});
thread.start();
...但它没有做任何事情,没有显示对话框,并且花费相同的时间向用户呈现UI。
我怎么能实现它?
谢谢。
编辑:
建议之后,试过毕加索。在这里你可以看到两种方法,毕加索和没有它:
String path=fotos.get(position).getFotoPath();
//Picasso.with(c).load(path).resize(80, 80).into(holder.foto);
Bitmap foto= BitmapFactory.decodeFile(path);
int bmWidth=foto.getHeight();
int bmHeight=foto.getHeight();
int ivWidth;
int ivHeigth;
int new_width;
int new_height;
ivWidth=dpToPx(80);
new_width=ivWidth;
new_height = (int) Math.floor((double) bmHeight *( (double) new_width / (double) bmWidth));
Bitmap newbitMap = Bitmap.createScaledBitmap(foto, new_width, new_height, true);
holder.lat.setText(fotos.get(position).getLatitud().toString());
holder.lon.setText(fotos.get(position).getLongitud().toString());
holder.foto.setImageBitmap(newbitMap);
使用Picasso,我无法在ImageView中看到图像。
答案 0 :(得分:1)
一个。不要在不是UI线程的线程上设置任何视图(就像你做的那样)。
B中。使用Picasso进行图像加载或其他一些库,不要重新发明轮子。 lib将在后台线程上执行所有加载,因此您不需要任何进度条(可能)。
按照这两个步骤操作,您的代码应该可以正常工作。
编辑: 问题可能是你的路径,我用picasso来加载urls而不是内部存储。打印你的路径并看一看。
答案 1 :(得分:0)
如果有人试图从设备加载图片,并且遇到与我相同的问题,这是使用Picasso和图像的正确语法:
prefKey