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滚动问题 的相关文章

  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • Android x86_64 和 x86 模拟器在 AlertDialog.onClick 事件上崩溃

    我正在 x86 64 和 x86 模拟器中测试 Android 应用程序 在从显示列表的 AlertDialog 中选择一个项目后 它崩溃了 Android 模拟器意外关闭 AlertDialog 是从 AppCompatActivity
  • 无法运行 android/sdk/build-tools/23.0.2/aapt

    最近在 Ubuntu 15 上安装了 Android Studio 1 0 1 由于某些原因是旧版本 我正在尝试创建一个新项目 每当我构建它时 我都会收到此错误 无法运行程序 home user Android Sdk build tool
  • ViewPager 开关 FragmentPagerAdapter

    我有一个ViewPager这是由一个FragmentPagerAdapter 我想将第一个适配器更换为另外两个 问题是之前加载的所有页面 同时具有第一个适配器 仍然是旧的页面 我查看了源代码FragmentPagerAdapter并猜测问题
  • Onclick 不会在 CardView 上触发

    我有一个OnClickListener on a CardView 仅当我点击内容之外的区域 TextViews ImageViews 时 侦听器才起作用 我的内部也有一个线性布局CardView 我希望当我点击屏幕上的任意位置时它就能工作
  • 无法在 Android 模拟器上使用 ART

    我只是想在我的模拟器上尝试 android 4 4 的 ART 我所做的是创建一个模拟器 选择设备为 Nexus 7 目标为 Android 4 4 RAM 512 然后我启动模拟器并加载它 然后我进入开发者选项并选择运行时作为 ART 设
  • sqlite 插入表中 select * from

    我需要在 Android 应用程序中将数据从一个表移动到另一个表 我想使用以下sql insert into MYTABLE2 select id STATUS risposta DATETIME now data ins from MYT
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 自定义 ListView 具有不同的行布局,根据 Web 服务响应进行扩展

    我有列表视图 我有3组观点 图像视图 视频查看 文本视图 我有一个返回图像 视频和文本的网络服务器 因此 根据服务器的响应 我想膨胀列表视图中行的视图 我知道使用自定义适配器来扩展自定义布局 我想知道如何使用自定义适配器来扩充视图类型 例如
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • Oreo(API 26)-drawOverlay + 在状态栏上绘制

    在android oreo中 我无法使用WindowManager LayoutParams TYPE SYSTEM ERROR不再需要并且必须使用WindowManager LayoutParams TYPE APPLICATION OV
  • ViewPager 的 Android Viewholder

    您好 我正在使用 ViewPager 但我现在想保留状态 而不是重新生成单元格 我注意到 viewpager 与 listviews 的自定义适配器非常相似 它们的功能类似 listview 在单元格不再出现在屏幕上后重新生成单元格中的数据
  • 如何在Android data/data/project文件系统中创建文件目录和文件夹

    我正在开发一个视频编辑器程序 并且对 android 和 java 相当陌生 我希望发生的是 当用户按下 创建新项目 按钮时 会弹出一个对话框 询问用户项目的名称 我已经把那部分写下来了 但是我想要的是 当用户在该对话框上按 确定 时 我的
  • 将 espresso 与自定义 EditText 结合使用

    这是我的布局的一部分
  • Android 和 iPhone 应用程序可以使用同一个 Facebook 应用程序 ID 吗?

    我有两个具有相同名称和相同功能的应用程序 一款在安卓市场 一款在应用商店 目前仅通过 iPhone 应用程序 您可以使用我创建的 Facebook 应用程序将您的分数发布到 Facebook 墙上 我的问题是我可以使用相同的 Android
  • Listview里面只有一个Element

    您好 我正在尝试将列表视图放入列表视图中的列表视图中 唯一的问题是只有第一个列表视图正确显示所有元素 此后的每个列表视图仅包含一个元素 UPDATE 创建我自己的不可滚动列表视图解决了这个问题 https stackoverflow com
  • 将视图放置在 ConstraintLayout 之外

    我想将视图放置在ConstraintLayout用滑动动画来制作它们的动画 我尝试过设置像这样的约束constraintBottom toTopOf parent 但是View留在容器内 请注意 我希望通过使用内置动画的约束来实现此目的 而
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 按照说明后“找不到您尝试购买的商品”

    所以我按照以下说明进行操作http developer android com google play billing billing admin html http developer android com google play bi
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • 什么是 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 其中每个单元格都包含自定义视图