Цель Пикассо из getView() адаптера
Я пытаюсь загрузить и сохранить изображения внутри функции getView() адаптера, используя мишень Пикассо. У меня есть URL, который указывает на изображение. Это изображение сохраняется на телефоне. Если изображение уже сохранено, я извлекаю его из памяти и дисплея телефона, в противном случае я использую цель Picasso для сохранения растрового изображения в памяти телефона. Моя проблема в том, что цель никогда не входит в функцию onBitmapLoaded, она только переходит к onBitmapFailed. Поэтому мое растровое изображение никогда не сохраняется в памяти телефона, так как сохранение происходит в функции onBitMapLoaded.
Приведенный ниже код является функцией getView(), внутри блока try catch внизу он проверяет, сохранен ли файл на диске. Если это так, я пытаюсь декодировать файл как растровое изображение и отображать его в imageView. В противном случае я использую цель Пикассо для загрузки изображения.
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
// Get or create the feedback wrapper to allow click feedback
LinearLayoutFeedback feedbackWrapper;
final ImageView imageView;
// First try to reuse previous views if available
if (convertView != null) {
feedbackWrapper = (LinearLayoutFeedback) convertView;
imageView = (ImageView) feedbackWrapper.getChildAt(0);
}
// If not create new views
else {
feedbackWrapper = new LinearLayoutFeedback(viewGroup.getContext());
imageView = new ImageView(viewGroup.getContext());
imageView.setLayoutParams(new ViewGroup.LayoutParams(PHOTOSTREAM_PICTURE_WIDTH, PHOTOSTREAM_PICTURE_HEIGHT));
imageView.setPadding(0, 0, 0, 0);//padding for image tiles
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
//imageView.setBackgroundColor(getResources().colorForClass(R.color.pstream_black));
feedbackWrapper.addView(imageView);
}
int circularPosition = getCircularPosition(position);
Photo photo = getPhotoData().get(circularPosition);
//Below line was commented out, and instead of using an ImageRequest to load into ImageView, we just use Picasso, it's easier and, handles
//errors better
// loadImage(photo.imageMed, imageView);
final String url = photo.imageMed;
try{
String fileName = Environment.getExternalStorageDirectory().getPath() + "/" + url;
File pic = new File(fileName);
if(pic.exists()){
Bitmap bitmap = BitmapFactory.decodeFile(fileName);
imageView.setImageBitmap(bitmap);
}else{
// loadImageWithPicasso(photo.imageMed, imageView);
final Target target = getTarget(url, imageView);
Picasso.with(getContext()).load(url).into(target);
imageView.setTag(target);
}
}catch (Exception e ){
e.printStackTrace();
}
return feedbackWrapper;
}
Ниже приведен код для getTarget (строковый URL, ImageView imageView)
Target getTarget(final String url, final ImageView imageView){
Target target = new Target(){
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
imageView.setImageBitmap(bitmap);
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + url);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
ostream.flush();
ostream.close();
} catch (IOException e) {
Log.e("IOException", e.getLocalizedMessage());
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.art_white)); }
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.art_white)); }
};
return target;
}
Я не понимаю, почему функция getTarget никогда не входит в onBitmapLoaded. Я также не понимаю, почему никакие изображения не отображаются внутри imageView с этим кодом. Любая помощь будет принята с благодарностью.
1 ответ
Код выше работает. Оказывается, Wi-Fi был отключен, так что я никогда не получал изображение с URL-адреса... Действительно отстой, что потратил столько времени на такую проблему. Единственная часть кода, которая все еще не верна, - это часть, где она пытается сохранить растровое изображение на SD-карту. Все еще пытаюсь выяснить, что я делаю там неправильно, но когда я это сделаю, я опубликую свое решение.