Android 阻止截击重新加载图像
我正在制作一个类似instagram的应用程序,因此可以从互联网上加载图像。加载的图像来自Parse.com的后端服务。我希望能够在listview中加载很多项,并防止listview在图像进入视图时重新加载图像。基本上,我不希望图像刷新,我希望它们即使在滚动时也保持在listview中 OnCreate Main活动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
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,例如,当用户滚动了大量项目时,从初始项目中删除位图显示我将执行此操作吗?抱歉,我只是在学习截击。检查我编辑的答案,了解文件缓存大小的增加,