Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
来源:互联网 发布:microsoft fix it win8 编辑:程序博客网 时间:2024/06/07 17:18
Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
在现在的Android开发中,越来越多的app都使用了Android的相册功能,使用相册就会用到GridView去加载图片,但是加载大量的图片的时候,会因为加载过程缓慢从而出现黑屏,而且因为图片越来越多从而引发出OOM的问题。这种情况就需要使用线程去异步加载图片并显示。
先看效果图:
- **
- 一个GridView控件
- 适配器
- 一个异步加载的自定义类
- 一个加载原图片的dialog
- **
activity_mail.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="activity.cc.com.demo014.MainActivity" android:orientation="vertical"> <GridView android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="3"/></LinearLayout>
注:只包含一个GridView控件
MainActivity.java:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //获取控件并实现点击事件 gridView = (GridView) findViewById(R.id.gridview); gridView.setOnItemClickListener(this); //getDatas方法是填充datas数据 getDatas(); //使用adapter填充数据 gridViewAdapter = new GridViewAdapter(this, datas, gridView); gridView.setAdapter(gridViewAdapter); }
GridViewAdapter.java:
package activity.cc.com.demo014;import android.app.Activity;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.GridView;import android.widget.ImageView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by admin on 2017/12/11. */public class GridViewAdapter extends BaseAdapter { List<GridViewData> datas = new ArrayList<GridViewData>(); GridView gridview; Activity activity; LayoutInflater inflater; AsyncImageLoader asyncImageLoader; /** * 实例化adapter并接收传递的数据 * @param activity * @param datas * @param gridview */ public GridViewAdapter(Activity activity, List<GridViewData> datas, GridView gridview){ this.activity = activity; this.datas = datas; this.gridview = gridview; //实例化LayoutInflater inflater = activity.getLayoutInflater(); //实例化异步加载图片的类 asyncImageLoader = new AsyncImageLoader(); } /** * 这个方法是显示的图片的个数 * @return 取决于datas的大小 */ @Override public int getCount() { return datas.size(); } /** * 获取每一个item的数据 * @param position * @return */ @Override public GridViewData getItem(int position) { return datas.get(position); } /** * getItemId * @param position * @return */ @Override public long getItemId(int position) { return position; } /** * 每加载一次系统调用一次 * @param position * @param convertView * @param parent * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { //当回收的view为空,重新获取 if(convertView == null){ convertView = inflater.inflate(R.layout.gridview_item, null); } convertView.setTag(position); //拿到每一个item的值 GridViewData info = getItem(position); //使用异步加载图片的类加载图片并实现回调 asyncImageLoader.loadDrawable(position, info.img_url, new AsyncImageLoader.ImageCallback() { @Override public void onImageLoad(Integer t, Bitmap bitmap) { View view = gridview.findViewWithTag(t); if(view != null){ Log.i("TAG", "加载成功..."); ImageView img_url = view.findViewById(R.id.img_url); img_url.setImageBitmap(bitmap); } } @Override public void onError(Integer t) { View view = gridview.findViewWithTag(t); if(view != null){ Log.i("TAG", "加载失败..."); ImageView img_url = view.findViewById(R.id.img_url); //加载中或者加载失败,默认加载app图标 img_url.setBackgroundResource(R.mipmap.ic_launcher); } } }); TextView txt_name = convertView.findViewById(R.id.txt_name); txt_name.setText(info.name); return convertView; }}
GridViewData.java:
package activity.cc.com.demo014;/** * Created by admin on 2017/12/11. */public class GridViewData { public GridViewData(String img_url, String name){ this.img_url = img_url; this.name = name; } public String img_url, name; public String getImg_url() { return img_url; } public void setImg_url(String img_url) { this.img_url = img_url; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "GridViewData{" + "img_url='" + img_url + '\'' + ", name='" + name + '\'' + '}'; }}
注:注意属性值是public。到这里图片的异步加载就结束了。下来就是单击图片实现查看原图。
MainActivity.java:
@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("TAG", "" + position); showImageDialog(position);}private void showImageDialog(int position) { //弹出友好提示框,提示用户确认注销? new CommomDialog(this, position, R.style.dialog, datas.get(position).getImg_url(), new CommomDialog.OnCloseListener() { @Override public void onClick(Dialog dialog, boolean confirm) { if(confirm){ dialog.dismiss(); } } }).setTitle(datas.get(position).getName()).show();}
CommomDialog.java:
package activity.cc.com.demo014;import android.app.Dialog;import android.content.Context;import android.graphics.Bitmap;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.TextView;/** * 封装的dialog */public class CommomDialog extends Dialog implements View.OnClickListener { private TextView textview_name; private ImageView image_url; private Context mContext; private String img_url; private OnCloseListener listener; private String positiveName; private String negativeName; private String title; int position; AsyncImageLoader asyncImageLoader; public CommomDialog(Context context) { super(context); this.mContext = context; } public CommomDialog(Context context, int themeResId, String img_url) { super(context, themeResId); this.mContext = context; this.img_url = img_url; } public CommomDialog(Context context, int position, int themeResId, String img_url, OnCloseListener listener) { super(context, themeResId); this.mContext = context; this.position = position; this.img_url = img_url; this.listener = listener; asyncImageLoader = new AsyncImageLoader(); } protected CommomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); this.mContext = context; } public CommomDialog setTitle(String title){ this.title = title; return this; } public CommomDialog setPositiveButton(String name){ this.positiveName = name; return this; } public CommomDialog setNegativeButton(String name){ this.negativeName = name; return this; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.imgae_view); setCanceledOnTouchOutside(false); initView(); initData(); } private void initData() { asyncImageLoader.loadDrawable(position, img_url, new AsyncImageLoader.ImageCallback() { @Override public void onImageLoad(Integer t, Bitmap bitmap) { image_url.setImageBitmap(bitmap); } @Override public void onError(Integer t) { image_url.setBackgroundResource(R.mipmap.ic_launcher); } }); textview_name.setText(title); } private void initView(){ image_url = findViewById(R.id.image_url); textview_name = findViewById(R.id.textview_name); image_url.setOnClickListener(this); } @Override public void onClick(View v) { int temdId = v.getId(); if(temdId == R.id.image_url){ dismiss(); }// switch (v.getId()){// case R.id.cancel:// if(listener != null){// listener.onClick(this, false);// }// this.dismiss();// break;// case R.id.submit:// if(listener != null){// listener.onClick(this, true);// }// break;// } } public interface OnCloseListener{ void onClick(Dialog dialog, boolean confirm); }}
imgae_view.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" > <TextView android:id="@+id/textview_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="TextView" android:textColor="#000000" /> <ImageView android:id="@+id/image_url" android:layout_width="match_parent" android:layout_height="wrap_content" app:srcCompat="@mipmap/ic_launcher" /></LinearLayout>
注:至此为止,功能就已经实现了。
优化:这里显示的图片是按照原尺寸显示的,如果需要固定大小并且充满布局,在ImageView控件上加上android:scaleType=”fitXY”这行代码就好。
GAME OVER!!!
点击下载源代码
CSDN貌似没有了免费下载资源的选项。所以,如果需要源代码又没有积分请留言…
阅读全文
0 0
- Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
- 【Android】网络图片加载优化(一)利用弱引用缓存异步加载
- android异步的网络图片加载,支持多线程异步加载
- android异步加载网络图片(1)
- 网络图片加载优化(一)利用弱引用缓存异步加载
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- android gridview 异步加载图片
- 在android中 软引用SoftReference异步加载网络图片
- 安卓GridView异步加载网络图片
- Android使用ImageLoader异步加载网络图片(一)读取单张图片
- Android 图片异步加载 加载网络图片
- (Android学习)ImageView设置异步加载的网络图片
- Android 异步加载网络图片到ImageView (Hnadler)
- 从人脸识别到行人重识别,下一个风口
- 网站登录之第三方微信登录
- Monkey测试
- [配置SSD进行目标检测]
- 获取webView内容高度,自适应高度
- Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
- 微软云计算,腾讯阿里验证加密
- spring boot 整合Swagger2
- 快速排序的实现
- 受限玻尔兹曼机(RBM)学习笔记(一)预备知识
- 润乾报表v5示例说明如何基于echarts模板调整满足个性需求
- struts2-10动态方法调用和使用通配符定义action
- map判断key不区分大小写
- Vue基础(条件渲染)