【问题标题】:Custom ArrayAdapter 'getView' method not being called upon update更新时未调用自定义 ArrayAdapter 'getView' 方法
【发布时间】:2013-08-20 16:34:21
【问题描述】:

所以我有一个我创建的自定义列表适配器,我正在尝试使其动态化。它开始是空的,然后用户可以动态添加或删除项目。一切正常,除了一件事:当我更新适配器时没有调用适配器的“getView”,因此项目的标题 - 显然 - 没有设置(而是显示它的地址)。 这是更新数组的代码:

private void newTab(String name, String url){
    _tabAdapter.add(new Article(name,url));
    _tabAdapter.notifyDataSetChanged();     
    _tabCount++;
}

这是适配器本身的代码:

public class TabAdapter extends ArrayAdapter<Article>{
        Context _context;
        @Override
        public int getCount() {
            return _tabCount;
        }

        public TabAdapter(Context c) {
            super(c, R.layout.tab_item);
            _context=c;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater=(LayoutInflater) _context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View _view = inflater.inflate(R.layout.tab_item, parent,false);
            TextView _itemText = (TextView) _view.findViewById(R.id.tab_text);
            Article getArticle = getItem(position);
            String newName = getArticle.getName();
            _itemText.setText(newName);
            return _view;
        }
    }   

现在其他一切都运行良好 - 即使 OnClick 运行良好并正确获取项目名称,只是列表本身不显示项目名称。我一定错过了一些非常基本的东西,但我找不到它是什么。任何帮助将不胜感激。

更新:虽然它不能解决所提到的确切问题,但我设法通过为“Article”类创建一个“toString()”方法来解决它 - 所以现在标题显示应该如此 - 除了它不是一个非常优雅的解决方案。

【问题讨论】:

  • 您的“更新”代码正在向列表末尾添加一个项目。您没有向我们展示您如何更改现有项目的标题。或者您是说您添加的新项目没有正确显示?
  • 后者。新项目显示的是内存地址而不是标题。

标签: android android-arrayadapter custom-adapter


【解决方案1】:

您需要一个构造函数来传递文章列表。

TabAdapter (Context context, int resource, T[] objects) 

每当您的列表被修改时,您都需要重新初始化适配器以获取更新后的视图。

【讨论】:

  • 所以每次更新适配器时都需要创建一个新的实例?
  • 不,这是不正确的。这就是 notifyDataSetChanged 的​​全部意义所在。您可以更改现有适配器的支持数据。
【解决方案2】:

根据您的问题,这个问题可能是因为当您调用它时确实调用了 getView() 方法,但它仍然具有旧数据,因此您可能以某种方式拥有 List Fragment 的冗余副本以及带有更新的适配器数据不可见

您可以在更新数据后通过 ListView.invalidateViews() 避免这种情况,这可能会强制您的列表显示新数据(应该调用您的 getView() 方法)。

在构造函数中传递值非常重要

在各个点进行调试,如果没有,请检查实现。

【讨论】:

  • 它根本没有被调用,我尝试过使用断点甚至日志写入,但没有一个被调用。 “invalidateViews()”也没有成功。
【解决方案3】:

ArrayAdapter 根据内部支持集合中的项目数跟踪它自己的计数。此外,每当您调用 add 时,它都会在内部调用 notifyDataSetChanged,除非您已通过调用 setNotifyOnChange(false) 明确禁用此功能。

作为调试它的第一步,您应该删除您的 getCount 覆盖以及对 notifyDataSetChanged 的调用。我看不出这是导致您的问题的明显方式,但最好从简化代码开始。

您是否偶然将此适配器与 Spinner 或类似小部件一起使用?如果是这样,您还必须覆盖getDropDownView,否则您将获得默认行为,即尝试将集合中的对象呈现为字符串。

【讨论】:

  • 不,这是一个常规的列表视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多