首页 > android中ListView嵌套GridView,其中某个GridView的内容无法显示?

android中ListView嵌套GridView,其中某个GridView的内容无法显示?

描述

我在ListView中嵌套了一个GridView,即每个item中都有一个GridView。
GridView中显示一组图片。

代码

ListView的适配器

下面是
ListView的适配器中的getView。
其中的list里面是一组图片的Uri。
我进行判断了一下,如果list里没有Uri,就隐藏GridView;如果有才给GridView设置适配器显示出来。

 @Override
        public View getView(int arg0, View convertView, ViewGroup arg2) {

            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.listview_main_item, null);
                viewHolder = new ViewHolder();

                viewHolder.mImgGridView = (GridView) convertView
                        .findViewById(R.id.gv_listView_main_gridView);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            ArrayList<String> list = (ArrayList<String>) initData().get(arg0).get("urls");
            if (list.size() == 0) {
                viewHolder.mImgGridView.setVisibility(View.GONE);
            } else {
                Log.d("PromotionalMaterialActi", "" + list.size());
                viewHolder.mImgGridView.setAdapter(new MyGridViewAdapter(context, list));
            }
            return convertView;
        }

数据

ArrayList<Map<String, Object>> mDatas = new ArrayList<Map<String, Object>>();

            //没图片
            Map<String, Object> map = new HashMap<>();
            ArrayList<String> urls = new ArrayList<String>();
            map.put("urls", urls);
            mDatas.add(map);

            //一张图片
            Map<String, Object> map2 = new HashMap<>();
            ArrayList<String> urls2 = new ArrayList<String>();
            urls2.add("http://img.my.csdn.net/uploads/201410/19/1413698883_5877.jpg");
            map2.put("urls", urls2);
            mDatas.add(map2);

            //三张图片
            Map<String, Object> map3 = new HashMap<>();
            ArrayList<String> urls3 = new ArrayList<String>();
            urls3.add("http://img.my.csdn.net/uploads/201410/19/1413698867_8323.jpg");
            urls3.add("http://img.my.csdn.net/uploads/201410/19/1413698883_5877.jpg");
            urls3.add("http://img.my.csdn.net/uploads/201410/19/1413698837_5654.jpg");
            map3.put("urls", urls3);
            mDatas.add(map3);

            //六张图片
            Map<String, Object> map4 = new HashMap<>();
            ArrayList<String> urls4 = new ArrayList<String>();
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698837_7507.jpg");
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698865_3560.jpg");
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698867_8323.jpg");
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698837_5654.jpg");
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698883_5877.jpg");
            urls4.add("http://img.my.csdn.net/uploads/201410/19/1413698839_2302.jpg");
            map4.put("urls", urls4);
            mDatas.add(map4);

            //六张图片
            Map<String, Object> map5 = new HashMap<>();
            ArrayList<String> urls5 = new ArrayList<String>();
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698837_7507.jpg");
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698865_3560.jpg");
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698867_8323.jpg");
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698837_5654.jpg");
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698883_5877.jpg");
            urls5.add("http://img.my.csdn.net/uploads/201410/19/1413698839_2302.jpg");
            map.put("urls", urls5);
            mDatas.add(map5);

现象描述

第四个item上的GridView图片无法显示


解决方法

viewHolder.mImgGridView.setVisibility(View.GONE);
这样第四个item上的GridView图片就会显示出来了。
但是这是为什么?


if (list.size() == 0) {
                viewHolder.mImgGridView.setVisibility(View.GONE);
            } else {
                Log.d("PromotionalMaterialActi", "" + list.size());
                viewHolder.mImgGridView.setAdapter(new MyGridViewAdapter(context, list));
            }

修改成

if (list.size() == 0) {
                viewHolder.mImgGridView.setVisibility(View.GONE);
            } else {
                Log.d("PromotionalMaterialActi", "" + list.size());
                viewHolder.mImgGridView.setVisibility(View.VISIBLE);
                viewHolder.mImgGridView.setAdapter(new MyGridViewAdapter(context, list));
            }

这样修改的原因是:有些Item中,list为空,所以你会设置mImgGridView属性为GONE。但当ListView从Holder中取到这个View复用的时候,这个mImgGridView始终为GONE,因此你需要手动设置为VISIBLE。


这是item复用的问题,所有设置状态的操作,必须考虑周全,即写了if条件的语句,默认else也需要设置缺省操作。

【热门文章】
【热门文章】