Android上的GridView滚动问题

2024-03-11

这一定是我忽略的非常简单的事情,但我有以下问题(帖子相当长,但我想提供尽可能多的信息:))。

我的 Android 应用程序中有一个 gridview,其中每个单元格都包含自定义视图:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
    <GridView
    android:id = "@+id/photosGridView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:drawSelectorOnTop="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:numColumns="6" 
    android:columnWidth="90dp"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="5dp"
    android:stretchMode="columnWidth"     
    >
</GridView>

</RelativeLayout>

每个单元格都是

<?xml version="1.0" encoding="utf-8"?>
<com.myapp.widgets.ImageThumbView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background = "@android:color/transparent"
  android:paddingLeft = "1dip"
  android:paddingRight = "1dip"
  android:paddingTop = "2dip"
  android:paddingBottom = "2dip"
  >
<ImageView
    android:id="@+id/thumbImage"
    android:layout_width="fill_parent"
    android:layout_height = "fill_parent"
    android:src="@drawable/icon_small"
    /> 

  <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height = "fill_parent"
    android:background = "@android:color/transparent"
   >

  <ImageView
   android:id="@+id/iconRight"
   android:layout_width="40px"
   android:layout_height = "40px"  
   android:src="@drawable/album_check"
   android:visibility="gone"
   android:layout_alignParentTop = "true"
   android:layout_alignParentRight = "true"     
   />

  <ImageView
   android:id="@+id/iconLeft"
   android:src="@drawable/album_check"
   android:visibility="gone"
   android:layout_width = "40px"
   android:layout_height="40px"
   android:layout_alignParentTop = "true"
   android:layout_alignParentLeft = "true"     
   /> 
</RelativeLayout>

</com.myapp.widgets.ImageThumbView>

我的适配器如下所示:

public class ImageAdapter extends BaseAdapter {
    private List<String> mPictures = null;

    public ImageAdapter(List<String> pictures) {
         mPictures = pictures;
    }

    public int getCount() {
          return mPictures != null ? mPictures.size() : 0;
    }
    public Object getItem(int position) {
          return mPictures != null ?  mPictures.get(position) : null;
    }
    public long getItemId(int position) {
          return mPictures != null ? position : -1;
    }
    @Override
    public View getView(int position,View convertView,ViewGroup parent) 
    {
        ImageThumbView i = null;
        try
            {               
            Thread.sleep(100);

            if (convertView == null) 
            {
                String path = mPictures.get(position);
                Log.d(((Integer)position).toString(), path);
                i = addSingleView(_li, path);
                TextView idx = (TextView) i.findViewById(R.id.caption);
                if (idx != null)
                    idx.setText(((Integer)position).toString());
            }
            else 
            {
                Log.d(((Integer)position).toString(), "ALREADY NOT NULL");
                i = (ImageThumbView) convertView;
                                    // These 2 lines were added only in desperate attempt to get it working, but it makes no difference
                String path = mPictures.get(position);
                i.updateView(path);
            }
        }
        catch(InterruptedException ie)
        {
            ie.printStackTrace();
        }
    return i;
        }
}

所以最初它工作正常,即它显示前 18 个图像和下一行的几个像素。但是当我开始滚动 gridvew 时,图像开始随机出现,即在最后一张图像之后我从一开始就看到很少的图像,依此类推。出于好奇,我尝试了一些像这样的示例:http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html...并看到相同的结果。

那么,我做错了什么吗?为什么 GridView 会显示比预期更多的项目?为什么项目出现在错误的位置?

BR, Alex


实际上,这里的问题是您在 if 或 else 中设置了“convertView”的内容。或者,如果视图为空,您应该始终在实例化视图之后执行此操作,并仅在返回视图之前设置内容。

因此,您可以确定视图的内容始终是正确的,并使用位置进行更新,而不是错误的回收视图。

因此,一般来说,您应该执行以下操作:
(基于 Android Guide 的教程here http://developer.android.com/resources/tutorials/views/hello-gridview.html)

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) { 
        imageView = new ImageView(mContext);
        //just creating the view if not already present
    } else {
        imageView = (ImageView) convertView;
        //re-using if already here
    }

    //here is the tricky part : set the content of the view out of the if, else
    //just before returning the view
    imageView.setImageResource(mThumbIds[position]);
    return imageView;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android上的GridView滚动问题 的相关文章

随机推荐

  • 什么是 XPS 文件以及如何使用它

    我有一个简单的 C net Web 应用程序 我正在使用 XPS 文件 我使用了以下代码 private void button1 Click object sender EventArgs e try string xpsFile D C
  • C++ 多维数组运算符

    是否可以以某种方式重载多维数组的运算符 就像是 class A int operator const int x const int y 不 那是不可能的 不过 还有两种选择 你可以有operator 返回较小维度的数组 对于 3D 数组
  • Swift 中的懒惰是什么意思? [复制]

    这个问题在这里已经有答案了 我询问了有关堆栈溢出的多个问题 但没有得到可以定义什么是 LAZY 关键字以及为什么我们在 Swift 中使用它的答案 我对 Swift 很陌生 请解释一下 该词在两种情况下使用 惰性变量是一种存储的属性 只计算
  • action:@selector(showAlert:) 如何在这个showAlert方法中传递参数?

    我正在将自定义按钮添加到我的UITableViewCell 在该按钮的操作中我想打电话showAlert 函数并希望在方法中传递单元格标签 我如何在其中传递参数showAlert方法 action selector showAlert 如果
  • ASP.NET Core 6 中的非缓冲输出

    我正在尝试使用真正基本的 ASP NET Core 6 应用程序实现简单的流 非缓冲输出 下面的简单代码应该将 hello world 文本输出到客户端 然后关闭连接 甚至通过添加文档IHttpResponseBodyFeature选项 a
  • Google 地图动态语言更改

    我在我的一个项目中使用backbone js 并且使用Google 地图api 版本3 根据一些ajax 响应 我想动态更改Google 地图语言 有什么方法可以做到这一点 任何建议将不胜感激 提前致谢 考虑以下示例 其中我使用按钮 但您可
  • Java 代码中出现“没有为‘plsql’语言注册查询执行器工厂”异常

    我有一个简单的报告 显示数据库中的字段 我在 Jasper 中设置了一个数据适配器并放置了查询 我可以从 Jasper 成功预览报告 但是当涉及到 Java 时 它无法编译报告并显示以下异常 2014 年 6 月 18 日下午 3 17 4
  • 测试实体框架数据库连接

    我有一个通过实体框架连接到 MYSQL 数据库的应用程序 它工作 100 完美 但我想添加一小段代码 用于在应用程序启动时测试与数据库的连接 我的想法是简单地对数据库运行一个小命令并捕获任何异常 但是如果出现问题 例如 App Config
  • 如何停止或暂停 Pandora 和 Spotify

    我有一个应用程序 具有启动应用程序 Pandora 站或快捷方式的功能 一切都很好 后来我想停止我启动的应用程序 这适用于大多数事情 但 Pandora 和 Spotify 并不总是关闭 有时他们会这样做 但并非总是如此 这似乎与当前的 U
  • 詹金斯使用什么外壳?

    Jenkins调用时使用什么shellshell命令 我在 Linux 机器上运行 Jenkins 从 执行 shell 部分的帮助 问号图标 运行 shell 脚本 默认为 sh 但这是可配置的 建设该项目 如果您转到管理 Jenkins
  • 使用 system.out.printf 格式化 java 字符串

    我一直在寻找很多关于 java 中的 System out printf 格式化字符串输出的问题 但我似乎不明白如何使用它 我正在尝试打印看起来像这样的漂亮专栏 601 GoPro Hero5 Black 276 95 602 GoPro
  • 查询具有 xmlns 节点属性的 XML 数据类型

    我有以下 SQL 查询 DECLARE XMLDOC XML SET XMLDOC
  • 如何在 PyTorch 中的特定新维度中重复张量

    如果我有一个张量A有形状 M N 我想重复张量 K 次 以便结果B有形状 M K N 和每片B k 应该具有相同的数据A 这是没有 for 循环的最佳实践 K可能在其他维度 torch repeat interleave and tenso
  • 父 ID 不在列表中时递归 CTE

    我有以下嵌套集 结果就是这棵树 1 2 4 7 8 10 9 3 5 6 13 11 12 我有一份产品清单 选择 ID 名称 来自产品 与类别的多对多关系 所有类别都可以有促销活动 好吧 现在问题来了 假设我有一个类别 7 8 6 的 P
  • jupyter笔记本中将代码单元更改为Markdown单元的快捷键

    有点傻 但是有没有快捷键可以将代码单元格更改为 Markdown 单元格 要放置 Markdown 单元格 我必须插入一个单元格 然后转到工具栏菜单 主菜单栏下方 然后选择 Markdown 而不是 Code Press M whilst
  • 构建应用程序后创建反应应用程序配置文件

    我希望在构建后根文件夹中有一个配置文件 JSON 来配置我的应用程序 like Translation and API Urls and 我可以使用 create React app 来做到这一点吗 Create config js or
  • 使用 Bicep 以编程方式获取服务总线 SharedAccessKey

    我正在使用二头肌来创建天蓝色资源 这些资源之一是服务总线 其定义如下 resource service bus Microsoft ServiceBus namespaces 2021 01 01 preview name service
  • 使用 numpy 数组计算时放置条件

    下面是一小段代码 由于某种原因 它不断生成以下值错误消息 ValueError 具有多个元素的数组的真值不明确 使用 a any 或 a all import numpy as np p np array 1 2 3 q np array
  • $interpolate 与 ng-repeat 和一次性绑定的性能比较

    At http www binpress com tutorial speeding up angular js with simple optimizations 135 http www binpress com tutorial sp
  • Android上的GridView滚动问题

    这一定是我忽略的非常简单的事情 但我有以下问题 帖子相当长 但我想提供尽可能多的信息 我的 Android 应用程序中有一个 gridview 其中每个单元格都包含自定义视图