【问题标题】:ListView deliver wrong position value in getView(..)ListView 在 getView(..) 中提供错误的位置值
【发布时间】:2015-08-22 17:30:02
【问题描述】:

我对此感到非常困惑。

问题很简单,我正在尝试调整 ImageView 的高度,为此,我得到了显示宽度并添加了 0.25 的百分比。

问题,如果我在 post() ImageView 方法之外设置了新的 height 值,则在 getView() 中传递的位置参数错误。如果我在 post() 中执行此操作,则显示的第一个元素不会重新缩放。

读取 cmets 内部代码。

public static class ViewHolder {

        ImageView imgAvatar;

        public void loadAvatar(SocialService socialService, long userId) {

            try {

                // SocialService.loadAvatar(..) is working with UniversalImageLoader.
                socialService.loadAvatar(this.imgAvatar, userId, true, false);
            } catch (Exception ex) {

                Log.e("APPERROR", ex.getMessage());
            }
        }
    }

 @Override
public View getView(int position, View view, ViewGroup parent) {

    ViewHolder holder;

    final User user = this.users.get(position);

    if (view == null) {

        holder = new ViewHolder();

        view = inflater.inflate(R.layout.adapter_list, parent, false);

        holder.imgAvatar = (ImageView) view.findViewById(R.id.people_list_avatar);

        // With this commented snippet of code, the first 4 elements (showed in the top of the listview) are not rescaled.
        // Position is deliver ok.
        // The rest of elements that are going showing while scrolling works pretty fine.
        // If scroll down and come back to the top then the 4 top first elements are showing rescaled.
        /*final ImageView imgAvatarAux = holder.imgAvatar;

        holder.imgAvatar.post(new Runnable() {

            @Override
            public void run() {

                imgAvatarAux.getLayoutParams().height =
                        (int) ((Display.deviceWidth(PeopleAdapter.this.context) / 2) * 1.25F);
            }
        });*/

        view.setTag(holder);

        // HERE IS THE QUESTION.
        // If I remove this line of code, position is deliver ok, but if it works, position is deliver senseless. WHY?
        holder.imgAvatar.getLayoutParams().height = (int) ((Display.deviceWidth(PeopleGridAdapter.this.context) / 2) * 1.25F);

        holder.loadAvatar(this.socialService, user.getId());
    }

    holder = (ViewHolder) view.getTag();

    ...

    if (position == 0) {

        // An interface method for another purposes...
        this.waitFinish.onFinish();
    }

    return view;
}

【问题讨论】:

  • 请澄清这一点“如果我在 post() ImageView 方法之外设置了新的高度值,则在 getView() 中传递的位置参数错误”
  • 当然是这一行-> holder.imgAvatar.getLayoutParams().height = (int) ((Display.deviceWidth(PeopleGridAdapter.this.context) / 2) * 1.25F);跨度>

标签: android


【解决方案1】:

发布您的 ListView 项目布局adapter_list。代码修复[对if(){}else{}之外的列表项的操作]:

    // HERE IS THE QUESTION.
    // If I remove this line of code, position is deliver ok, but if it works, position is deliver senseless. WHY?
    holder.imgAvatar.getLayoutParams().height = (int) ((Display.deviceWidth(PeopleGridAdapter.this.context) / 2) * 1.25F);
    view.setTag(holder);

} else {

    holder = (ViewHolder) view.getTag();
}

    holder.loadAvatar(this.socialService, user.getId());

【讨论】:

  • 那是我的第一次,但如果我调用 holder.loadAvatar() 总是每次都会调用图像并且 ListView 太滞后了。
  • 图片是通过 HTTP 加载的?
  • 是用UniversalImageLoader加载的,加载过程->内存缓存(如果没有)->磁盘缓存(如果没有)->HTTP(如果没有)->默认资源drawable。
  • 此外,还有一个自定义的列表视图,每次都在滚动。
  • 有可能,解决问题的最佳方法是实现第一个显示的第一个项目可以调整大小。然后一切都会好起来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多