【问题标题】:Android: ListView doesn't populate completelyAndroid:ListView 没有完全填充
【发布时间】:2011-03-17 00:47:30
【问题描述】:

我正在尝试为我的应用程序构建一个 RSS 提要阅读器,但我遇到了一个奇怪的问题。为了实现这个提要,我使用了一个从自定义的 ArrayList 中填充的 ListView。

我知道 ArrayList 中包含我想要显示的所有字段(我在我的 Logcat 中打印所有字段),但是当我运行应用程序时,并非我的 ListView 中的所有单元格都填充了它们应该显示的信息到,它们的主要部分显示TextView。它似乎很随机,但始终正确工作的是第一个元素。其他的有时会这样做。

另外一个奇怪的事情是 OnItemClickListener 可以完美运行,即使我无法看到元素中的信息。

非常感谢您。

我附上我的 getView 代码:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    AdapterWrapper wrapper;
    if (v == null) {
        LayoutInflater li = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.itemrow, null);
        wrapper = new AdapterWrapper(v, cont);
        v.setTag(wrapper);
    } else {
        wrapper = (AdapterWrapper) convertView.getTag();
        RssItem o = this.getItem(position);
        if (o != null)
            wrapper.populateFrom(o);
        parent.refreshDrawableState();
    }
    return v;
}

【问题讨论】:

  • 我们需要看代码。
  • 你说你“定制”了一个 ArrayList 是什么意思?
  • 对不起,我的意思是我扩展了一个 ArrayAdapter
  • 而且我没有发布任何代码,因为我不知道错误在哪里,并且发布所有类似乎不是一个好的选择。
  • 我得到了它的工作,我有一个 { 不应该在 else 字之后。

标签: android listview populate


【解决方案1】:

您可能没有正确处理 getView 中的回收视图案例。

当您查看convertView != null 时,您仍然需要在您的convertView 中实际填充信息。实际的视图层次结构将在那里,但信息将来自与不同行关联的旧的、回收的视图。

如需更多具体信息,请发布您的getView 代码。

编辑 - 我认为无论您是否有convertView,您都需要致电wrapper.populateFrom(o)。尝试将该部分移到 if 语句之外:

 if (v == null) {
    LayoutInflater li = (LayoutInflater) this.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = li.inflate(R.layout.itemrow, null);
    wrapper = new AdapterWrapper(v, cont);
    v.setTag(wrapper);
 } else {
    wrapper = (AdapterWrapper) convertView.getTag();
 }
 RssItem o = this.getItem(position);
 if (o != null)
    wrapper.populateFrom(o);
 parent.refreshDrawableState(); // not sure what this is doing

【讨论】:

  • 我弄错了,我认为这是我能做的最愚蠢的事情,一个不应该去那里的{。
  • 你应该总是像我上面贴的那样使用花括号,否则很容易犯这样的错误。
  • 是的,这正是我在查看我发布的代码时所意识到的。非常感谢!!
【解决方案2】:

我让它工作了,我有一个 { 不应该在

其他

字,所以代码最终是:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    AdapterWrapper wrapper;
    if (v == null) {
        LayoutInflater li = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.itemrow, null);
        wrapper = new AdapterWrapper(v, cont);
        v.setTag(wrapper);
    } else
        wrapper = (AdapterWrapper) convertView.getTag();

    RssItem o = this.getItem(position);
    if (o != null)
        wrapper.populateFrom(o);
    parent.refreshDrawableState();

    return v;
}

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2013-02-17
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多