android - 快速滚动 ListView 时出现问题

标签 android android-listview android-arrayadapter

我正在做一个小项目,我在其中创建了一个绑定(bind)到 ArrayAdapter 的 listview。在 ArrayAdapter 的 getView() 函数中,我在线程上从网络 urls 加载图像,并将它们设置为列表项(当然基于位置,所以 url[0] 图片设置为 list_item[0] 等)。这一切似乎都运作良好。

但是,当我测试该应用程序时,我注意到如果我等待我的 ListView 完全显示,然后来回快速滚动,我有时会看到一个列表项上的图像错位在其他列表项上(就像处于中间状态)。但是,直到我将错误显示的项目滚动出屏幕然后再返回时,它才会消失。

我不知道这是否与我使用线程加载 web url 有关,或者从本地资源文件夹加载图像可能有同样的问题。

这实际上引出了我对 getView() 函数的疑问。我认为我的 getView() 中的逻辑是正确的,因为它就像将 url 绑定(bind)到基于位置查看一样简单。每当 getView() 有机会被调用时,例如当我将项目滚动出屏幕然后返回时,它将使列表项目正确显示。

我不明白的是如何解释发生的问题(如中间状态),以及如何在编写代码时避免它?

我在下面粘贴了我的适配器代码 fragment ,但我认为这个问题可能是一个普遍的问题:

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

        ViewHolder viewHolder = null;

        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(layoutResourceId, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.title = (TextView) v.findViewById(R.id.title);
            viewHolder.description = (TextView) v.findViewById(R.id.description);
            viewHolder.image = (ImageView) v.findViewById(R.id.image);

            v.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) v.getTag();
        }

        listItem item = items[position];  //items is some global array
                                          //passed in to ArrayAdapter constructor
        if (item != null) {
            viewHolder.title.setText(item.title);   
            viewHolder.description.setText(item.description);

            if (!(item.imageHref).equalsIgnoreCase("null")) {
                mDrawableManager.fetchDrawableOnThread(item.imageHref, viewHolder.image);
            } else {
                viewHolder.image.setImageDrawable(null);
            }
        }
        return v;
    }
}

static class ViewHolder {
    TextView title;
    TextView description;
    ImageView image;
}

最佳答案

当快速滚动时,我遇到了同样的问题,它将某些项目的值与其他项目交替,就像某些项目的背景颜色随机变化一样。我通过大量搜索解决了这个问题,并找到了确切的解决方案,如果您在适配器中使用 ViewHolder,只需在适配器中添加这两种方法

@Override
    public int getViewTypeCount() {
        return getCount();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

关于android - 快速滚动 ListView 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13083597/

相关文章:

android - 创建 CursorLoader 时未定义 SwapCursor

android - Exoplayer - 主 URL 之间的连接媒体源

java - Spinner 仅根据用户操作更新

android - React Native WebStorm Emulator 无法启动 - 错误无法启动模拟器。原因 : No emulators found as an output of `emulator -list-avds`

android - OnClickItem 不工作 Android

android - 滚动时ListView "coming back"

java - ArrayAdapter getView 返回 NullPointerException -

java - 如何在 Android ListView 中显示 Firebase 项目?

android - 将 onClickListener 设置为由自定义适配器填充的 LinearLayout

android - string.compareTo(string) 在排序时没有产生正确的结果