2014-10-25 3 views
0

Я делаю приложение, которое похоже на instagram и поэтому загружает изображения из Интернета. Загруженные изображения поступают из бэкэнд-сервиса Parse.com. То, что я хочу сделать, - это загрузить множество элементов в списке и предотвратить перепросмотр списка из образа, когда он появится. В принципе, я не хочу, чтобы изображения обновлялись, я хочу, чтобы они оставались в списке, даже когда я прокручиваю.Stop Volley от перезагрузки изображений

OnCreate MainActivity

imageCache = new BitmapLruCache(); 
imageLoader = new ImageLoader(Volley.newRequestQueue(getApplicationContext()), imageCache); 

PostsAdapter

public class PostsAdapter extends BaseAdapter implements StickyListHeadersAdapter { 

    private Context context; 
    public List<PostList> postList; 

    public void add(PostList object,int position) { 
     postList.add(position,object); 
    } 

    public PostsAdapter(Context context) { 
     this.context=context; 
     postList = new ArrayList<PostList>(); 
    } 

    public int getCount() { 
     return postList.size(); 
    } 

    public PostList getItem(int position) { 
     return postList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if(convertView == null){ 
      convertView = LayoutInflater.from(context).inflate(R.layout.posts_list, null); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
      }else{ 
      holder = (ViewHolder)convertView.getTag(); 
      holder.imageView.setImageUrl(null, imageLoader); 
      } 
     holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       // TODO Auto-generated method stub 

        postList.get(position).liked = isChecked; 

      } 
     }); 
     holder.imageView.setOnClickListener(new DoubleClickListener(){ 

      @Override 
      public void onSingleClick(View v) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onDoubleClick(View v) { 
       // TODO Auto-generated method stub 
       holder.checkbox.setChecked(true); 
       postList.get(position).liked = true; 
      } 
     }); 

     holder.checkbox.setChecked(postList.get(position).liked); 
     holder.imageView.setSoundEffectsEnabled(false); 
     holder.imageView.setImageUrl(postList.get(position).postPicture, imageLoader); 
     return convertView; 
    } 

    @Override 
    public View getHeaderView(int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 
     HeaderViewHolder HVH; 
     if(convertView == null){ 
      convertView = LayoutInflater.from(context).inflate(R.layout.post_header_list, null); 
      HVH = new HeaderViewHolder(convertView); 
      convertView.setTag(HVH); 
     }else{ 
      HVH = (HeaderViewHolder)convertView.getTag(); 
     } 
     CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
       Long.parseLong(postList.get(position).user), 
       System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 
     HVH.username.setText(timeAgo); 
     return convertView; 
    } 

    @Override 
    public long getHeaderId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    } 
public abstract class DoubleClickListener implements OnClickListener { 

    private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds 

    long lastClickTime = 0; 

    @Override 
    public void onClick(View v) { 
     long clickTime = System.currentTimeMillis(); 
     if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){ 
      onDoubleClick(v); 
     } else { 
      onSingleClick(v); 
     } 
     lastClickTime = clickTime; 
    } 

    public abstract void onSingleClick(View v); 
    public abstract void onDoubleClick(View v); 
} 
static class ViewHolder{ 
NetworkImageView imageView; 
CheckBox checkbox; 
    ViewHolder(View v){ 
      imageView = (NetworkImageView)v.findViewById(R.id.Posts_Image); 
      checkbox = (CheckBox)v.findViewById(R.id.liked); 

ответ

0

В Следуя функции NetworkImageView

@Override 
protected void onDetachedFromWindow() { 
    if (mImageContainer != null) { 
     // If the view was bound to an image request, cancel it and clear 
     // out the image from the view. 
     mImageContainer.cancelRequest(); 
     setImageBitmap(null); 
     // also clear out the container so we can reload the image if necessary. 
     mImageContainer = null; 
    } 
    super.onDetachedFromWindow(); 
} 

Вы заметите, что растровое изображение я s устанавливается в null, вы можете отредактировать это в своей библиотеке и удерживать изображение столько, сколько хотите ... Но размер HEAP станет большим, если вы это сделаете .../ Итак, держите некоторую логику для очистки растровый, когда не требуется

EDIT: Для увеличения размера кэша в хранилище файлов Вы можете изменить значение в DiskBasedCache файл

/** Default maximum disk usage in bytes. */ 
private static final int DEFAULT_DISK_USAGE_BYTES = 10 * 1024 * 1024; 

Вы посмотрите на следующий пост для допустимого размера кучи может Android heap size on different phones/devices and OS versions Вы можете играть с

Runtime.getRuntime().maxMemory(); and 
Runtime.getRuntime().freeMemory(); 

Чтобы решить, когда начать освобождать растровые изображения. Так что вместо того, чтобы прямо говорить

setImageBitmap(null); // You can say if only 30% is free let's start freeing memory 

if (Runtime.getRuntime().freeMemory() < Runtime.getRuntime().freeMemory()* 0.3) 
     setImageBitmap(null); 
+0

Есть ли другой способ предложить вам что-то подобное? Приложение в основном должно работать как Instagram, будет ли это замедлять производительность? Есть ли более эффективный способ? – Rhynoboy2009

+0

Вы можете попробовать увеличить размер файла Volley FileBasedCache для получения изображения из локальных плоских файлов, – maaz

+0

Также вы можете поместить некоторую логику, как если бы отбросить изображение из NetworkImageView, например, когда пользователь прокрутил большое количество элементов, удалите растровое изображение из начального items – maaz

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