android - 为什么 GridView 中的适配器不更新其内容?

标签 android android-layout gridview

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

fragment :

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 进行调试,看来树位置确实已更新,但 View 保持不变。 这让我相信我犯的错误是在适配器的 getView 方法中,但我一生都无法弄清楚。

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

fragment :

 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;
}

任何帮助将不胜感激。

最佳答案

即使convertView为空,您也应该将数据更改反射(reflect)到 View 中。 伪代码:

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

当convertView为null时,您为它创建,当它不为null时,意味着您之前创建过,并且android将这个脏 View 传递给getView,因此您需要更新它以反射(reflect)底层数据。 View 创建和 View 配置是不同的事情。

关于android - 为什么 GridView 中的适配器不更新其内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32425134/

相关文章:

java - 代码较短,因此用相同的值填充数组

c# - ASP.NET Gridview ButtonField onclick 触发包含行的 onclick 事件

c# - 放置图像 Gridview 删除按钮

Adobe Air 中的 Android 生命周期

android - 如何在外部对象上实现 Parcelable?

android - 如何使用从外部设备流式传输的 setVideoURI 从 android videoview 获取帧?

android - Layout_height 不想在使用 fragment 时逐渐包装内容

Android软键盘仅 float 特定布局

android 显示大量文本

android - 分隔符填充,忽略它