注:Volley库的NetworkImageView怎么用,网上有很多资料,这里只是记述我在项目中使用NetworkImageView读取网络图片然后通过ListView显示出来的做法和步骤(由于是截取删减项目代码,可能会有遗漏的地方),以备我以后查用(能帮助其他人将是我的荣幸),因为我也是在同学的帮助以及查询网络下完成的。
0、引用Volley库
1、布局文件
主页面布局xml中的ListView控件
<ListView
android:id="@+id/lv_typelist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:scrollbars="none"/>
显示图片加文字的模板xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="80dp"
android:layout_height="100dp">
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/imageview_typeImg"
android:layout_width="match_parent"
android:layout_height="80dp"
android:scaleType="centerCrop"
android:layout_gravity="center"
android:gravity="center">
</com.android.volley.toolbox.NetworkImageView>
<TextView
android:id="@+id/textview_typeName"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="center"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
用NetworkImageView替代安卓自身的ImageView控件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="80dp"
android:layout_height="100dp">
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/imageview_typeImg"
android:layout_width="match_parent"
android:layout_height="80dp"
android:scaleType="centerCrop"
android:layout_gravity="center"
android:gravity="center">
</com.android.volley.toolbox.NetworkImageView>
<TextView
android:id="@+id/textview_typeName"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="center"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
2、创建自定义的Application,用来获取Volley的队列对象
public class MyApplication extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue() {
return queue;
}
}
public class MyApplication extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue() {
return queue;
}
}
修改AndroidManifest.xml文件android:name=".MyApplication
如下:
android:name=".MyApplication
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.user.myfirstapp">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppBaseTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
public class BitmapCache implements ImageLoader.ImageCache {
//内存缓存
private static LruCache<String, Bitmap> mMemoryCache;
//单例
private static BitmapCache lruImageCache;
private BitmapCache(){
// Get the Max available memory
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory/10;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
//获取单例实例
public static BitmapCache instance(){
if(lruImageCache == null){
lruImageCache = new BitmapCache();
}
return lruImageCache;
}
//从内存获取图片
@Override
public Bitmap getBitmap(String url){
return mMemoryCache.get(url);
}
//图片放入到内存
@Override
public void putBitmap(String url, Bitmap bitmap){
if(getBitmap(url) == null){
mMemoryCache.put(url, bitmap);
}
}
}
4、Activity或Fragment中代码(我这里是在Fragment中)
private View view;
private ListView lv_type;
private TextView typename;
private ImageView right_top_img;
private Gson gson;
private List<GoodsType> list;
private ArrayList<HashMap<String, Object>> listItem;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view =inflater.inflate(R.layout.flg_type,container,false);
lv_type=(ListView)view.findViewById(R.id.lv_typelist);
....此处省略一些代码....
showImageList();
....此处省略一些代码....
return view;
}
private void showImageList(){
if(list!=null&&list.size()>0) {
NetworkImageViewAdapter adapter = new NetworkImageViewAdapter(getActivity());
lv_type.setAdapter(adapter);
//点击事件
lv_type.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(id==-1)
return;
int realPosition=(int)id;
ListView lv = (ListView)ListView;
Object object=lv.getItemAtPosition(realPosition);
//转对应的自定义的实体类型
GoodsType gt = (GoodsType)object;
//分类id
int typeId = gt.getId();
.........
}
}
}
public class NetworkImageViewAdapter extends BaseAdapter {
private LayoutInflater layoutInflater = null;
class ViewHolder {
TextView name;
NetworkImageView image;
}
public NetworkImageViewAdapter(Context context)
{
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public Object getItem(int position) {
return list == null ? null : list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.twoleveltypelist_item, null);
viewHolder.name = (TextView) convertView.findViewById(R.id.textview_typeName);
viewHolder.image = (NetworkImageView) convertView.findViewById(R.id.imageview_typeImg);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
GoodsType gt = list.get(position);
viewHolder.name.setText(gt.getTypeName());
ImageLoader imageLoader = new ImageLoader(MyApplication.getHttpQueue(), BitmapCache.instance());
viewHolder.image.setTag("url");
viewHolder.image.setImageUrl(gt.getTypeImg(), imageLoader);
return convertView;
}
}
上面代码中的list是通过volley获取服务器的json对象发序列化得到的集合,GoodsType是一个实体对象,list就是
GoodsType实体的集合,gt.getTypeName()获取的商品类型的名称,gt.getTypeImg()获取的商品类型的图片url。
5、效果图如下: