Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 阻止截击重新加载图像_Android_Listview_Parse Platform_Android Volley - Fatal编程技术网

Android 阻止截击重新加载图像

Android 阻止截击重新加载图像,android,listview,parse-platform,android-volley,Android,Listview,Parse Platform,Android Volley,我正在制作一个类似instagram的应用程序,因此可以从互联网上加载图像。加载的图像来自Parse.com的后端服务。我希望能够在listview中加载很多项,并防止listview在图像进入视图时重新加载图像。基本上,我不希望图像刷新,我希望它们即使在滚动时也保持在listview中 OnCreate Main活动 imageCache = new BitmapLruCache(); imageLoader = new ImageLoader(Volley.newRequestQueue(g

我正在制作一个类似instagram的应用程序,因此可以从互联网上加载图像。加载的图像来自Parse.com的后端服务。我希望能够在listview中加载很多项,并防止listview在图像进入视图时重新加载图像。基本上,我不希望图像刷新,我希望它们即使在滚动时也保持在listview中

OnCreate Main活动

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);
公共类PostsAdapter扩展BaseAdapter实现StickyListHeadersAdapter{
私人语境;
公开名单张贴名单;
公共void add(PostList对象,int位置){
添加(位置、对象);
}
公共PostsAdapter(上下文){
this.context=context;
postList=newarraylist();
}
public int getCount(){
返回postList.size();
}
公共PostList getItem(内部位置){
返回postList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
convertView=LayoutInflater.from(context).充气(R.layout.posts\u list,null);
支架=新的视图支架(convertView);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
holder.imageView.setImageUrl(null,imageLoader);
}
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
postList.get(position).liked=isChecked;
}
});
holder.imageView.setOnClickListener(新的DoubleClickListener(){
@凌驾
单个单击上的公共无效(视图v){
//TODO自动生成的方法存根
}
@凌驾
双单击上的公共无效(视图v){
//TODO自动生成的方法存根
holder.checkbox.setChecked(true);
postList.get(position).liked=true;
}
});
holder.checkbox.setChecked(postList.get(position.like));
holder.imageView.setSoundEffectsEnabled(假);
holder.imageView.setImageUrl(postList.get(position.postPicture,imageLoader);
返回视图;
}
@凌驾
公共视图getHeaderView(内部位置,视图转换视图,
视图组(父级){
//TODO自动生成的方法存根
头颈肩关节;
if(convertView==null){
convertView=LayoutInflater.from(context).充气(R.layout.post\u header\u list,null);
HVH=新的HeaderViewer(convertView);
convertView.setTag(HVH);
}否则{
HVH=(HeaderViewHolder)convertView.getTag();
} 
CharSequence timeAgo=DateUtils.getRelativeTimeSpanString(
Long.parseLong(postList.get(position.user)),
System.currentTimeMillis(),DateUtils.SECOND(单位:毫秒);
HVH.username.setText(很久以前);
返回视图;
}
@凌驾
公共长getHeaderId(内部位置){
//TODO自动生成的方法存根
返回位置;
}
}
公共抽象类DoubleClickListener实现OnClickListener{
私有静态最终长双击时间增量=300;//毫秒
长lastClickTime=0;
@凌驾
公共void onClick(视图v){
长点击时间=System.currentTimeMillis();
如果(单击时间-上次单击时间<双击时间增量){
onDoubleClick(v);
}否则{
onSingleClick(v);
}
lastClickTime=单击时间;
}
公共摘要无效(视图五);
公开摘要无效双击(视图五);
}
静态类视窗夹{
网络图像视图;
复选框;
视图支架(视图v){
imageView=(NetworkImageView)v.findViewById(R.id.Posts\u Image);
复选框=(复选框)v.findViewById(R.id.like);

在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();
}
你会注意到,图像位图被设置为null,你可以在你的库中编辑它,并保持图像,只要你想。。。 但是如果这样做,堆的大小会变大/ 所以在不需要的时候保留一些清理位图的逻辑

编辑: 用于增加文件存储中的缓存大小 您可以更改DiskBasedCache文件中的值

/** Default maximum disk usage in bytes. */
private static final int DEFAULT_DISK_USAGE_BYTES = 10 * 1024 * 1024;
您可以在下面的帖子中查看允许的堆大小 你可以和我一起玩

 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);
setImageBitmap(null);//您可以说,如果只有30%是可用的,那么让我们开始释放内存
if(Runtime.getRuntime().freemory()
您有没有其他方法可以建议这样做?该应用程序基本上应该像Instagram一样运行,这会降低性能吗?有没有更有效的方法?您可以尝试增加截取本地平面文件中图像的凌空FileBasedCache大小,也可以设置一些逻辑,例如何时丢弃图像om NetworkImageView,例如,当用户滚动了大量项目时,从初始项目中删除位图显示我将执行此操作吗?抱歉,我只是在学习截击。检查我编辑的答案,了解文件缓存大小的增加,