2

更新:基于我的 BaseAdapter 的 gridview / listview 在 Android 4.3 中停止工作。如果我在 Android 4.2 或更低版本中运行它,它可以正常工作。

我用“愚蠢的”getView() 尝试了它,它每次都会膨胀一个新视图,它不会改变任何事情。

原始问题:

我有一个列表视图和一个网格视图。它们是我的数据的 2 种不同图形表示。我的问题是两者都有,所以从现在开始我只写adapterview,但它可能意味着两者。

我使用扩展 BaseAdapter 的自定义适配器设置了我的适配器视图。它主要工作,但有时当我更改设置(在 PreferenceActivity 意图中)并更改我的数据集时,调用 notifyDataSetChanged(),屏幕不会刷新。更准确地说,一些项目会被刷新,但其余项目会保留在屏幕上,就像更改前一样。

我阅读了许多教程,观看了 Romain Guy 的视频,似乎我错过了一些非常基本的东西,但无法弄清楚它是什么。

我加了一些调试,奇怪的是,我调用notifyDataSetChanged()后,调用getCount(),可以看到数字变了,甚至调用getView(),就是不刷新item屏幕上。然而,在我触摸屏幕后,一切都被渲染了(尽管 getView() 再次为所有可见视图调用)

这是我的 getView() 函数的开始:

public View getView(final int position, final View convertView1, final ViewGroup parent) {
    Log.d(TAG, "getView(" + position + ", " + convertView1 + ", " + parent + ")");
    ViewHolder holder;
    CategoryListItemView convertView = null;
    if (convertView1 == null) {
        if (SettingsActivity.getBrowserLayout(CategoryBrowserActivity.this)) {
            convertView = (CategoryListItemView)inflator.inflate(R.layout.category_list_item, parent, false);
        } else {
            convertView = (CategoryListItemView)inflator.inflate(R.layout.category_grid_item,parent, false);
        }
        holder = new ViewHolder();
        holder.imageView = (ImageView)convertView.findViewById(R.id.category_item_icon);
        holder.textView = (TextView)convertView.findViewById(R.id.category_browser_list_title);
        holder.featuresLayout = (LinearLayout)convertView.findViewById(R.id.features);
        convertView.setTag(holder);
        convertView.setFilter(getCategoryFilter());
        convertView.setOnClickListener(this);
        convertView.setOnLongClickListener(this);
    } else {
        convertView = (CategoryListItemView)convertView1;
        holder = (ViewHolder)convertView.getTag();
    }

我将 convertView1 转换为 CategoryListItemView 的原因是因为我稍后在 getView() 中使用了它的自定义函数。

我的适配器视图是 GridView 或 ListView,相应的项目是 category_grid_item 或 category_list_item,每当我在 2 个可视化之间进行更改时,我都会使适配器无效(无论如何我的问题不存在)

4

1 回答 1

2

您必须在 ui 线程上调用 adapter.notifyDatasetChanged()

于 2014-08-11T11:03:18.200 回答