我的GridView / ListView只有在android api 18+中触摸后才能呈现

时间:2014-03-16 22:28:17

标签: android listview gridview baseadapter notifydatasetchanged

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

我用" dumb" getView(),每次都会膨胀一个新视图,它不会改变一个东西。

原始问题:

我有一个listview和一个gridview。它们是我数据的2种不同图形表示。我的问题都适用于这两个,所以从现在起我只会编写适配器视图,但它可能意味着两者。

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

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

我添加了一些调试,奇怪的是,在我调用notifyDataSetChanged()之后,它调用了getCount(),你可以看到数字已经改变了,它甚至调用了getView(),它只是没有&#39 ; t刷新屏幕上的项目。然而,在我触摸屏幕后,所有内容都会呈现(尽管再次为所有可见视图调用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个可视化之间切换时,我使适配器无效(无论如何我的问题都没有)

1 个答案:

答案 0 :(得分:1)

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