2015-10-03 3 views
2

Я пытаюсь создать RecyclerView с фрагментами, которые загружают изображения с сервера, но я столкнулся с некоторыми проблемами: При прокрутке вверх, вы можете видеть предыдущие фотографии, я действительно этого не хочу. И второе дело, что у меня сбой в OOM, я не знаю, что с ним делать, могут ли мне помочь некоторые более опытные программисты?Что такое правильный способ создания RecyclerView с загрузкой изображений?

Мой фрагмент кода адаптера:

public class MyPliksAdapter extends RecyclerView.Adapter <MyPliksAdapter.MyViewHolder>{ 

private LayoutInflater inflater; 
private List<MyPlikClass> myPliksList = Collections.emptyList(); 
VolleySingleton volleySingleton; 
ImageLoader imageLoader; 

public MyPliksAdapter (Context context, List<MyPlikClass> myPliks) { 
    inflater = LayoutInflater.from(context); 
    myPliksList =myPliks; 

    volleySingleton = VolleySingleton.getsInstance(); 

    imageLoader = volleySingleton.getImageLoader(); 

} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.fragment_my_pliks_single,parent,false); 
    MyViewHolder holder = new MyViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    final MyPlikClass currentItem = myPliksList.get(position); 


    //TODO: 
    if (currentItem.myPlikUserFromImgUrl != null){ 

     imageLoader.get(currentItem.myPlikUserFromImgUrl, new ImageLoader.ImageListener() { 
      @Override 
      public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) { 

       holder.myPlikUserFromImg.setImageBitmap(imageContainer.getBitmap()); 
      } 

      @Override 
      public void onErrorResponse(VolleyError volleyError) { 

      } 
     }); 
    } 

    if (currentItem.myPlikPhotoUrl != null){ 

     holder.myPlikPhoto.setImageUrl(currentItem.myPlikPhotoUrl,imageLoader); 
     //(, "Wrong sesion, pls relogin", Toast.LENGTH_SHORT).show(); 
    } 

    //holder.myPlikGetDate.setText(currentItem.myPlikGetDate); 

    byte[] titleData = Base64.decode(currentItem.myPlikTitle, Base64.DEFAULT); 
    byte[] descriptionData = Base64.decode(currentItem.myPlikDescription, Base64.DEFAULT); 
    byte[] nameData = Base64.decode(currentItem.myPlikUserFromName, Base64.DEFAULT); 

    //byte[] data = Base64.decode(currentItem.myPlikTitle, Base64.DEFAULT); 
    String title = null; 
    String name = null; 
    String description = null; 

    try { 
     title = new String(titleData, "UTF-8"); 
     name = new String(nameData, "UTF-8"); 
     description = new String(descriptionData, "UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

    if(description != null && !description.isEmpty()) { 
     holder.myPlikDeskription.setText(description); 
     holder.descriptionLayout.setVisibility(View.VISIBLE); 
    } 

    holder.myPlikTitle.setText(title); 
    holder.myPlikUserFromName.setText(name); 
    holder.myPlikUserFromNickname.setText(currentItem.myPlikUserFromNickname); 
} 

@Override 
public int getItemCount() { 
    return myPliksList.size(); 
} 

class MyViewHolder extends RecyclerView.ViewHolder { 
    NetworkImageView myPlikPhoto; 
    ImageView myPlikUserFromImg; 
    TextView myPlikUserFromName; 
    ImageView myPlikDeskriptionIcon; 
    TextView myPlikDeskription; 
    TextView myPlikUserFromNickname; 
    //TextView myPlikGetDate; 

    TextView myPlikTitle; 
    RelativeLayout descriptionLayout; 
    //RecyclerView recyclerView; 
    //GalleryAdapter adapter; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     myPlikTitle = (TextView) itemView.findViewById(R.id.myPlikTitle); 
     myPlikUserFromName = (TextView) itemView.findViewById(R.id.myPlikUserFromName); 
     myPlikUserFromNickname = (TextView) itemView.findViewById(R.id.myPlikUserFromNickname); 
     myPlikUserFromImg = (ImageView) itemView.findViewById(R.id.myPlikUserFromImg); 
     myPlikPhoto = (NetworkImageView) itemView.findViewById(R.id.profile_plick_content_img); 
     myPlikDeskription = (TextView) itemView.findViewById(R.id.profile_plick_content_description); 
     myPlikDeskriptionIcon = (ImageView) itemView.findViewById(R.id.profile_plik_content_comment_icon); 
     descriptionLayout = (RelativeLayout) itemView.findViewById(R.id.descripdion_block); 

     //adapter = new GalleryAdapter(inflater.getContext(), getImgIds()); 
     //recyclerView = (RecyclerView) itemView.findViewById(R.id.galleryList); 

    } 

} 
} 

ответ

3

Эта проблема очень сложная, поэтому я рекомендую использовать Picasso (http://square.github.io/picasso/) для обработки проблемы с имиджем. Он обрабатывает утилиту ImageView и отменяет загрузку в адаптере.

Также есть официальное руководство по устранению проблем параллелизма при загрузке изображений в список: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html. Это решение, основанное на AsyncTask, также работает.

Для проблем с OOM попробуйте уменьшить размер изображений до их загрузки в память. Проверьте это: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

+0

Спасибо, действительно.) –

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

  • Нет связанных вопросов^_^