我是一个刚刚踏上编程道路的菜鸟,第一次写博客想想还有点小激动。
在上一家公司做项目时遇到一个ListView嵌套GridView显示晒单的功能,刚开始想到的就是使用九宫格显示图片,但是在做的过程中没有找到适合的案例,大多都是把数据写在本地,这不乎合我们的要求。所以打算自己写一个。不多说废话,先上效果图:
我使用的是fastJson和gson进行网络数据的获取。
fastjson链接:http://download.csdn.net/download/first773/9528334
gson链接:http://download.csdn.net/detail/qq_25837957/9316521
在app build gradle中导入glide图片缓存框架
compile 'jp.wasabeef:glide-transformations:2.0.1'
解决好三方jar包问题,开始我们的代码工作。
1、首先ListView嵌套GridView是只会显示一行item的,所以我们自定义GridView,重写onMeasure方法重新计算GirdView的高度。
public class ViewGridView extends GridView{ public ViewGridView(Context context) { super(context); } public ViewGridView(Context context, AttributeSet attrs) { super(context, attrs); } public ViewGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
2、javaBean直接使用gsonformat生成
3、进行数据请求,这个地方注意把属性请求的方法放到onResume()中,我测试了几次,放到onCreat()中有可能绑定适配器的list集合为空
private void JSON(String s) { HandlerUtils.getBytes(s, new HandlerUtils.HandlerCallBack() { @Override public void fetchData(byte[] bytes) { String msg=new String(bytes); Result result=Result.parse(msg); JSONArray array1=JSON.parseArray(result.getData()); for (int i = 0; i < array1.size(); i++) { JavaBean.DataBean javaBean=new Gson().fromJson(array1.getJSONObject(i).toString( ),JavaBean.DataBean.class); childList.add(javaBean); } adapter=new MyAdapter(context,childList); listView.setAdapter(adapter); adapter.notifyDataSetChanged(); } }); }
4、接下来就是适配器绑定,主要是listView的adapter中getView绑定GirdView适配器
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder=null; JavaBean.DataBean data=mList.get(position); childBeanList=mList.get(position).getChild(); if (convertView==null){ viewHolder=new ViewHolder(); convertView= LayoutInflater.from(context).inflate(R.layout.layout_item,null); viewHolder.iamge_head= (ImageView) convertView.findViewById(R.id.image_head); viewHolder.nickName= (TextView) convertView.findViewById(R.id.nickName); viewHolder.gridView= (GridView) convertView.findViewById(R.id.girdView); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.nickName.setText(data.getName()); GridViewAdapter adapter=new GridViewAdapter(childBeanList ,context); viewHolder.gridView.setAdapter(adapter); String img=data.getIcon(); if (img!=null){ Glide.with(parent.getContext()).load(img).into(viewHolder.iamge_head); } return convertView; }