【问题标题】:Why adapter in a grid view is not updating its content?为什么网格视图中的适配器不更新其内容?
【发布时间】:2015-09-06 15:25:05
【问题描述】:

我有一个树结构,如果节点有子节点,则节点为类别,如果没有,则为项目。 我使用 gridView 和自定义适配器绘制了顶级类别。 我注册了一个单击事件处理程序,在其中更改了树的级别并通知 gridView 数据已更改。

片段:

gridview = (GridView) findViewById(R.id.gridview);
    ma = new MenuAdapter(this, menu); //menu is the tree I pass to the adapter
    gridview.setAdapter(ma);

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            //ma.setSubTree(position);
            menu = menu.children.get(position);
            gridview.deferNotifyDataSetChanged();
            gridview.invalidateViews();
                    Toast.makeText(MainActivity.this, "" + position,
                    Toast.LENGTH_SHORT).show();
        }
    });

使用 stdout 进行调试,看起来树的位置确实更新了,但视图保持不变。 这让我相信我犯的错误是在适配器的 getView 方法中,但对于我来说,我无法弄清楚。

getView 从每个 Tree 节点的数据中扩充自定义布局(图像缩略图和 TextView)。

片段:

 public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View gridView;
    if (convertView == null) {
        // if it's not recycled, initialize some attributes
        gridView = new View(mContext);
        gridView = inflater.inflate(R.layout.grid_item, null);

        TextView textView = (TextView) gridView.findViewById(R.id.gridItemText);
        textView.setPadding(15, 15, 15, 15);
        textView.setText(menu.children.get(position).toString());

        com.beardedhen.androidbootstrap.BootstrapCircleThumbnail thumb = (com.beardedhen.androidbootstrap.BootstrapCircleThumbnail) gridView.findViewById(R.id.thumb);
        thumb.setImage(menu.children.get(position).imageSource);
    } else {

        gridView = (View) convertView;
    }
    return gridView;
}

任何帮助将不胜感激。

【问题讨论】:

  • 你不会使用ExpandableListView,作为结构吗?
  • 我不希望它扩展。我可能选择了错误的布局,但是一旦用户选择了一个类别,我只想显示该类别,最好是带有项目的图片。
  • 一个主细节设计,也许吧?您有类别的 ListView 或 GridView。当一个项目被点击时,另一个 Fragment (detail) 会替换主 Fragment,显示选定的类别项目。
  • 感谢您的建议。我会看看那个,也许会改变。但我怀疑问题会持续存在,因为仍然需要更新树。

标签: android android-layout gridview


【解决方案1】:

即使 convertView 为空,您也应该将数据更改反映到视图。 伪代码:

if(convertView == null) {
    convertView = inflater.inflate(...);
}
// update view below
// set your textView etc.

当convertView为null时,你为它创建,当它不为null时,表示你之前创建的,android将这个脏视图传递给getView,所以你需要更新它以反映底层数据。视图创建和视图配置是不同的东西。

【讨论】:

  • 您的个人资料信息显示您有 9 个答案和 0 个赞。在这里,有我的支持,好先生 :) 并欢迎使用 stackoverflow
  • @Tawcharowsky 哇,我没想到会这样,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2014-09-02
  • 1970-01-01
  • 2011-12-16
  • 2017-02-17
相关资源
最近更新 更多