【问题标题】:Wrong 'convertView' object while scrolling a list view滚动列表视图时出现错误的“convertView”对象
【发布时间】:2014-07-22 08:37:18
【问题描述】:

我的问题是,当我滚动列表视图时,我得到了错误的 convertView,但位置是正确的。

我的 Listview 中有 3 个项目,加载时使用索引 '0' 调用“位置”参数,并且 convertView 为 null

当我一个一个滚动时,到下一个项目'位置'是 '1' 并且 convertView 也是 null

问题出在第 3 项上,'position' 是 '2' 但 'convertView' not null,它由 first 填充项目转换视图

这是为什么呢?

 public View getView(final int position, View convertView, ViewGroup parent) {
        View itemView = convertView;
        if (itemView == null) {
            itemView = getLayoutInflater().inflate(R.layout.post_layout, parent, false);

            postViewHolder                              = new PostViewHolder();
            postViewHolder.commentsImageButton          = (ImageButton) itemView.findViewById(R.id.postAddCommentsImageButton);

            itemView.setTag(postViewHolder);
        }else{
            postViewHolder = (PostViewHolder) itemView.getTag();
        }

}

【问题讨论】:

  • 为什么需要在 convertView 中定位?
  • return 语句丢失。 return itemView

标签: android position convertview getview


【解决方案1】:

您的 listView 中只会获得 N 个 null 项,此值 N 将根据屏幕中输入的行数而变化。

例如,如果您的屏幕中有 3 行,您可能会有 4 或 5 行项目。这是因为 Android 将旧视图回收到新视图中。

如果您需要跟踪持有人的位置,请将您的 postViewHolder.position 从您的 if / else 语句中移出。

希望对你有帮助。

【讨论】:

  • 感谢您的回答。我已经从问题中删除了 postViewHolder.position,这无关紧要。
  • 感谢您的回答。我知道它会回收旧视图,但是使用 viewHolder 模式它会加载一个回收的 convertView,这是错误的,来自“findViewByID”的所有视图都将引导回收的 convertView 而不会创建新视图。
  • 为什么你需要创建一个新的?这就是 ListViews 的工作方式。如果您的列表视图中有更多项目,则将被回收到这N个视图中,这些视图是您显示信息所需的视图。
【解决方案2】:

试试这个

public View getView(final int position, View convertView, ViewGroup parent) {
        View itemView = convertView;
        PostViewHolder postViewHolder = null;
        if (itemView == null) {
            itemView = getLayoutInflater().inflate(R.layout.post_layout, parent, false);
            postViewHolder                              = new PostViewHolder();
            postViewHolder.commentsImageButton          = (ImageButton) itemView.findViewById(R.id.postAddCommentsImageButton);

            itemView.setTag(postViewHolder);
        }else{
            postViewHolder = (PostViewHolder) itemView.getTag();
        }
        postViewHolder.position    = position;
        :do your stuff with postViewHolder
        :
        return itemView;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多