2016-04-15 5 views
0

Итак, я пытаюсь загрузить несколько эскизов, которые у меня есть на моем сервере Parse, но он не совсем работает.Parse - Загрузить изображение в GridView

Проблема, с которой я столкнулась, находится вне цикла for, который загружает изображения в GridView. По какой-то причине битмап не добавляется в список.

Вот мой код:

private void getUserThumbs(){ 
    Log.i("thumbs", "ThumbnailsFragment executed."); 
    thumbItemsList = new ArrayList<ThumbnailItems>(); 
    final String userObjectID = ProfileActivity.objectID; 
    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.getInBackground(userObjectID, new GetCallback<ParseUser>() { 
     @Override 
     public void done(ParseUser parseUser, ParseException e) { 
      if (e == null) { 
       try { 
        ParseQuery<ParseObject> postQuery = new ParseQuery<ParseObject>(
          "Post"); 
        postQuery.whereEqualTo("user", parseUser); 
        postQuery.orderByDescending("createdAt"); 
        objectList = postQuery.find(); 
        for (ParseObject parseObject : objectList) { 
         final ThumbnailItems thumbItems = new ThumbnailItems(); 
         ParseFile image = (ParseFile) parseObject.get("image"); 
         if (image != null) { 
          image.getDataInBackground(new GetDataCallback() { 
           @Override 
           public void done(byte[] bytes, ParseException e) { 
            if (e == null) { 
             Bitmap userImage = BitmapFactory.decodeByteArray(bytes, 0 
               , bytes.length); 
             thumbItems.setThumb(userImage); 
            } else { 
             Log.d("ParseException", "Error: " + e.getMessage()); 
             e.printStackTrace(); 
            } 
           } 
          }); 
         } 
         thumbItemsList.add(thumbItems); 
        } 
        gridViewAdapter = new GridViewAdapter(getContext() 
          , thumbItemsList); 
        gridView.setAdapter(gridViewAdapter); 
        swipeRefreshLayout.setRefreshing(false); 

       } catch (ParseException e1) { 
        e1.printStackTrace(); 
       } 
      } else { 
       e.printStackTrace(); 
       Log.i("ParseException", e.getMessage()); 
      } 
     } 
    }); 
} 

А вот мой адаптер:

package co.eshg.limo4.adapter; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import java.util.ArrayList; 
import java.util.List; 
import co.eshg.limo4.R; 
import co.eshg.limo4.data.ThumbnailItems; 

public class GridViewAdapter extends BaseAdapter { 
    Context context; 
    LayoutInflater inflater; 
    private List<ThumbnailItems> thumbnailsItemsList = null; 
    private ArrayList<ThumbnailItems> arrayList; 

public GridViewAdapter(Context context, List<ThumbnailItems> thumbnailItemsList) { 
    this.context = context; 
    this.thumbnailsItemsList = thumbnailItemsList; 
    inflater = LayoutInflater.from(context); 
    this.arrayList = new ArrayList<>(); 
    this.arrayList.addAll(thumbnailItemsList); 
} 

public class ViewHolder { 
    ImageView imgThumb; 
} 

@Override 
public int getCount() { 
    return thumbnailsItemsList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return thumbnailsItemsList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    ViewHolder holder; 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(R.layout.profile_viewpager_tab1_children, null); 
     holder.imgThumb = (ImageView) view.findViewById(R.id.imgThumb); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
    Bitmap image = thumbnailsItemsList.get(position).getThumb(); 
    holder.imgThumb.setImageBitmap(image); 

    return view; 
} 
} 

EDIT:

Так я пытался возиться с ним, и я вы получили его на работу. Теперь проблема заключается в том, что изображение не загружается, пока я не нажму на экран. Я не знаю, почему это происходит.

Решение должно было положить thumbItemsList.add(thumbItems) в состояние if (if (e == null)), и я понятия не имею, почему это не сработает.

+0

Но сервер синтаксического анализа закрывается jan2017, и их srrvices wil перестают работать ,,, поэтому рассмотрите возможность переноса вашего backend – user5894647

+0

Уже сделано. – UltraAlkaline

+1

, тогда вам повезло с вашим приложением. – user5894647

ответ

0

Посмотрите, не знаю, почему это происходит ..

Но я рекомендую вам использовать эту библиотеку here

Он использует концепцию LazyLoad

В вашем Gradle файле

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 

Вам нужно установить только один раз (при открытии проекта)

private void ConfigureImageLoader(){ 
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .resetViewBeforeLoading(true) 
       .cacheOnDisk(true) 
       .cacheInMemory(true) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .displayer(new FadeInBitmapDisplayer(300)) 
       .build(); 


     ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(getApplicationContext()); 
     config.defaultDisplayImageOptions(defaultOptions); 
     config.memoryCache(new WeakMemoryCache()); 
     config.threadPriority(Thread.NORM_PRIORITY - 2); 
     config.denyCacheImageMultipleSizesInMemory(); 
     //config.diskCacheFileNameGenerator(new Md5FileNameGenerator()); 
     config.diskCacheSize(10 * 1024 * 1024); // 10 MiB 
     config.tasksProcessingOrder(QueueProcessingType.LIFO); 
     config.writeDebugLogs(); // Remove for release app 

     ImageLoader.getInstance().init(config.build()); 
} 

Ваш адаптер

private DisplayImageOptions options; 
public GridViewAdapter(Context context, List<ThumbnailItems> thumbnailItemsList) { 
    options = new DisplayImageOptions.Builder() 
        .showImageOnLoading(R.drawable.naodisponivel) 
        .showImageForEmptyUri(R.drawable.naodisponivel) 
        .showImageOnFail(R.drawable.naodisponivel) 
        .cacheInMemory(true) 
        .cacheOnDisk(true) 
        .considerExifParams(true) 
        .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
        .displayer(new SimpleBitmapDisplayer()) 
        .build(); 

} 

в вашем GetView

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    ViewHolder holder; 
    if (view == null) { 
     // 
    } else { 
     // 
    } 
      ImageLoader imageLoader = ImageLoader.getInstance(); 
      final String finalImgURL = "www.mysite.com/myimage.jpg" //change url here 
      imageLoader.displayImage(finalImgURL, holder.imgThumb, options); 

    return view; 
} 

Он загружает изображения в LazyLoad и кэши в celuar на следующий раз не нужно снова загрузить изображения, конечно что вы настраиваете параметры

Я помог.

+0

Это не было бы динамичным решением. Мне нужно вручную добавить URL каждого изображения, который я хочу загрузить, чего я не ищу. Спасибо за предложение. – UltraAlkaline

Смежные вопросы