【问题标题】:Gridview in Listview is repeating the last gridview items for every lineListview 中的 Gridview 正在重复每一行的最后一个 gridview 项目
【发布时间】:2016-03-17 07:05:27
【问题描述】:

我正在尝试为每一行制作一个列表视图:标题和项目网格。使用下面的代码,我得到了正确标题的列表,但每一行的 gridView 都填充了最后一行的项目。

日志显示,每次调用 getView 时,它都会获取具有正确标题的正确项目。我怀疑有一个共享引用,或者我在某处写错了行。

类似的问题都是观点回收的问题,我做对了。

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = l_Inflater.inflate(R.layout.list_item_my_listview, null);
        holder = new ViewHolder();
        holder.txt_name = (TextView) convertView.findViewById(R.id.name);
        holder.myGridView = (GridView) convertView.findViewById(R.id.my_gridview);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    listItemDetails item = itemDetailsArrayList.get(position);
    holder.txt_name.setText(item.name);

    gridItemListAdapter gridArrayAdapter = new gridItemListAdapter(context, item.getGridItems());
    holder.myGridView.setAdapter(gridArrayAdapter);

    Util.Log(getClass().getName());
    Util.Log(cabinetId + " - " + cabinet.getCageList().size());
    return convertView;
}

【问题讨论】:

  • 您对所有行使用相同的适配器。所以当最后一行得到更新时,所有网格项的值都是一样的......
  • @HourGlass 这可以解释。但是每次调用 getView 时,我都会使用正确的项目创建一个新的 gridItemListAdapter 实例。那怎么一样呢?
  • 你能检查一下你的数据,是否所有的数据都是唯一的?
  • @NigamPatro 是的。一行有 1 项,另外 7 项,因此它们非常不同。现在我只看到两行都有相同的 1 项。在日志记录中,它清楚地表明正确的 ID 与正确的项目数相匹配。所以发生的事情显然是它以某种方式为 gridview 设置了正确的值,然后在设置下一行时覆盖它。
  • 意思是,整个gridview?

标签: java android listview gridview


【解决方案1】:

就像我在上面的评论中所说,当您在此行的item.getGridItems() 上获得项目的GridView 时,就会出现问题:

gridItemListAdapter gridArrayAdapter = new gridItemListAdapter(context, item.getGridItems());

问题不在于具有每个实例的适配器。最后一行的重复发生是因为 - 我会尝试猜测你的结构,我不知道,但我看到了线索 - 每次调用此方法时,您可能会使用相同的 array 等相同的值。 因此,每个适配器实例中的每个 GridItems 引用都会更改最后一行的最后更新。

当我进行测试以解决此问题时,我通过调用对象处理避免在适配器中的getView() 中进行额外的工作。我使用了一个已经设置好的对象字段。因此,您必须执行与获取项目名称相同的操作:item.name 才能获取 gridview 的项目,如下所示:

gridItemListAdapter gridArrayAdapter = new gridItemListAdapter(context, item.gridItems);

在你的Item 对象中应该是这样的:

public ArrayList<Images> gridItems; // arraylist or whatever
...
public void setGridItems(ArrayList<Images> gridItems) { // set it when you set the name
    this.gridItems = gridItems;
}

因此,Item 对象的每个实例都会有新的GridItems

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2018-06-04
    • 1970-01-01
    • 2010-10-29
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多