Android ListView中嵌套GridView,GridView不显示

Android:ListView嵌套GridView显示问题排查
在Android开发中遇到ListView嵌套的GridView不显示的问题。分析了可能的原因包括布局、适配器实现和数据设置。通过检查自定义NoScrollGridView、适配器的方法实现及设置固定高度,最后发现是数据设置的低级错误,即对象引用未正确传递导致数据未显示。解决方案是确保数据正确添加到适配器中。

记得这个问题是之前也有见过的,不过一直发现不了问题。今天突然有了一种必须必须必须要处理掉它的决心,通过网上查看,还是没有一篇文章有出现这种情况的,而是gridview显示不全的问题。而我的问题是gridview全部不显示。

出现这种情况,个人分析觉得就三种情况:

  1. 布局 (继承NoScrollGridView)
  2. 适配器 (是否实现各个方法所需的)
  3. 数据设置 (刷新、不小心clear掉了、数据对象的赋值)

推敲问题:

  • 首先确定自定义的MyGridView是继承NoScrollGridView
  • 然后看适配器是否正确的实现了各个方法
  • 再给布局中给MyGridView设置固定的高度
  • 如果还有显示的话,那就可能数据设置问题
  • 查找发现,原来是低级错误,也可能是我们java基础的问题

先附上自己定义的错误适配器MyGridAdapter

public class MyGridAdapter extends BaseAdapter {

    private Context mContext;
    private List<GridItem> mItems = new ArrayList<>();

    public MyGridAdapter(Context context) {
        mContext = context;
    }

    @Override
    public int getCount() {
        return mItems.size();
    }

    @Override
    public GridItem getItem(int position) {
        if (mItems.size() > 0) {
            return mItems.get(position);
        }
        return new GridItem();
    }

    public List<GridItem> getItems() {
        return mItems;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ......
        return view;
    }

    public void targetClick(int position) {
        targetClick(getItem(position));
    }

    public void targetClick(GridItem item) {
    }

    public void setItems(List<GridItem> items) {
        this.mItems.clear();
        if (items != null) {
            addItems(items);
        }
        notifyDataSetChanged();
    }

    private void addItems(List<GridItem> items) {
        this.mItems = items;
    }

    public Context getContext() {
        return mContext;
    }
}

不要纠结上面GridItem类跟getView(..)方法的实现,因为这些都是相信你们都懂吧,这些都不是我要特别介绍的,而是想说的是addItems()方法,大家看错了什么问题了吗?

举个例子:

ArrayList<String> A= new ArrayList<String>();  
A.add("1");  
A.add("2");  
ArrayList<String> B;  
B = A;  

此时B对象相当与A对象的引用,而并不是将A对象的值单纯的传递给B对象。
即:B对象的操作将直接改变A对象。如B.add(“3”);结果A中也包含了“3”

看到这里你应该明白怎么回事了吧。原来我的addItems中只是拿到了对象的引用,而没有真正的把值传递给mItems对象,所以就出现了一大乌龙——为什么gridview老是不显示的问题。

解决方式:

private void addItems(List<GridItem> items) {
    for (GridItem item : items) {
        this.mItems.add(item);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值