如何在 ExpandableListView 中保留滚动位置

2023-12-21

在我的应用程序中,我有一个派生自 ExpandableListActivity 的类。 当我滚动内容,然后更改手机方向或编辑项目然后返回列表时,原始列表位置不会保留。 我尝试了两种解决方案,类似于我最近在 ListActivity 派生类中成功使用的解决方案。

解决方案一:

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    mListState = state.getParcelable(LIST_STATE);
}

protected void onResume() {
    super.onResume();
    loadData();
    if (mListState != null)
        getExpandableListView().onRestoreInstanceState(mListState);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    mListState = getExpandableListView().onSaveInstanceState();
    state.putParcelable(LIST_STATE, mListState);
}

解决方案2:

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    mListPosition = state.getInt(LIST_STATE);
}

protected void onResume() {
    super.onResume();
    loadData();
    getExpandableListView().setSelection(mListPosition);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    mListPosition = getExpandableListView().getFirstVisiblePosition();
    state.putInt(LIST_STATE, mListPosition);
}

这两种解决方案都不起作用。我还尝试结合这两种解决方案,当我编辑项目并返回列表时,这有效,但当我更改手机方向时,它不起作用

任何人都可以建议一个实现我的目标的好方法吗?


经过几次实验,我得到了一个令人满意的解决方案,它还保留了顶部可见项目的精细滚动位置。

事实上,需要保存和恢复三条不同的信息:列表状态(例如,展开了哪些组)、第一个可见项的索引及其精细滚动位置。

不幸的是,可扩展列表视图的onSaveInstanceState方法似乎只保存了第一个,因此其他两个需要单独保存。这与不可展开的列表视图不同,在不可展开的列表视图中,onSaveInstanceState 方法保存了正确恢复列表状态和位置所需的所有信息(关于此主题,请参阅返回 ListView 时保持/保存/恢复滚动位置 https://stackoverflow.com/questions/3014089/scroll-to-a-position-in-a-listview).

这是代码片段;在 ExpandableListActivity 派生类之上:

private static final String LIST_STATE_KEY = "listState";
private static final String LIST_POSITION_KEY = "listPosition";
private static final String ITEM_POSITION_KEY = "itemPosition";

private Parcelable mListState = null;
private int mListPosition = 0;
private int mItemPosition = 0;

然后,一些覆盖:

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);

    // Retrieve list state and list/item positions
    mListState = state.getParcelable(LIST_STATE_KEY);
    mListPosition = state.getInt(LIST_POSITION_KEY);
    mItemPosition = state.getInt(ITEM_POSITION_KEY);
}

protected void onResume() {
    super.onResume();

    // Load data from DB and put it onto the list
    loadData();

    // Restore list state and list/item positions
    ExpandableListView listView = getExpandableListView();
    if (mListState != null)
        listView.onRestoreInstanceState(mListState);
    listView.setSelectionFromTop(mListPosition, mItemPosition);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);

    // Save list state
    ExpandableListView listView = getExpandableListView();
    mListState = listView.onSaveInstanceState();
    state.putParcelable(LIST_STATE_KEY, mListState);

    // Save position of first visible item
    mListPosition = listView.getFirstVisiblePosition();
    state.putInt(LIST_POSITION_KEY, mListPosition);

    // Save scroll position of item
    View itemView = listView.getChildAt(0);
    mItemPosition = itemView == null ? 0 : itemView.getTop();
    state.putInt(ITEM_POSITION_KEY, mItemPosition);
}

这在我的 Froyo 设备上运行良好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ExpandableListView 中保留滚动位置 的相关文章

  • 如何为android数据绑定点击监听器编写proguard规则?

    我在用databinding在我的应用程序中 它运行良好 但是当我启用minifyEnabled true and shrinkResources true比它告诉我一些错误 Execution failed for task app tr
  • 如何在Android上获取当前播放曲目的路径[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想编写一个应用程序将当前播放的音乐流式传输到另一台设备 两个设备之间的连接确实有效 我还可以通过 wifi 传输一些字符串 但在获取
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • 如何从Slog中查看日志

    如何查看 Slog API 生成的日志 是否有任何选项可以查看系统缓冲区中的日志 我的意思是查看我们使用的无线电缓冲区的日志 adb logcat b 无线电 而这个日志是由Android的Log类生成的 Slog API 的输出在哪里 怎
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • 新安装的Eclipse和Android SDK。无法让模拟器工作。挂在时钟屏幕上

    我对开发是全新的 我已经安装了 Eclipse 和 Andoid SDK 但是 我无法让模拟器工作 我已经尝试过示例记事本代码和 Hello Android 教程代码 每次我尝试运行任一应用程序时 它都会挂在时钟屏幕上 屏幕上还显示正在充电
  • 如何从画布中删除路径区域(Android)

    我需要裁剪角落ImageView 不要将它们弄圆 而是擦除每个角上的三角形 似乎唯一的方法就是覆盖onDraw方法并使用从画布上删除这些区域Path 问题是我没有纯色背景 所以我需要擦除这些区域 但不要用某种颜色填充它们 我为此使用以下代码
  • Android - 使用 SAX 解析器解析大文件

    我正在尝试使用 SAX 解析器解析来自 webservice 的 xml 数据 当我尝试使用 URL 解析数据 大小 7 4MB 时 它工作正常 但是当我从 URL 复制 xml 数据并放置 xml 文件时 size 7 4MB 在raw文
  • 通过配置更改保留 CoroutineScope 的干净方法,无需 ViewModel

    我知道建议是在我们的 Activity 中使用 ViewModel 这样我们就可以使用它viewModelScope 由于 ViewModel 的寿命比 Activity 的寿命长 因此我们不必取消以下作业activity onDestro
  • 如何防止应用程序被盗(针对Android应用程序)?

    我想知道防止人们窃取我的应用程序的最有效方法是什么 在线下载 apk 的副本而不是购买它 我已经花了一个lot特别是 Droidbox 上的时间 并且不会发布 Sync 直到我可以保证提供专业版本的非法副本的人无法发布 有人实施过这个吗 我
  • foo.setVisibility(View.GONE) 和parent.removeView(foo) 之间的区别

    如果 foo 是一个视图 那么有什么区别foo setVisibility View GONE and fooParent removeView foo 我对两个语句之前和之后视图的内存消耗特别感兴趣 可见性设置为 GONE 的视图是否会消
  • 活动中列表视图中的粘滞行

    我的列表视图中只有一行应该是粘性的 而不是粘性标题中带有字母的部分或部分 我真的很感激任何关于列表视图在活动中粘性一行而不是片段的帮助 我该怎么做 我真的很感谢任何帮助 提前致谢 使用如下代码 class MyAsyncTask exten
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • 带有工具提示的搜索栏 android

    Hi All 我正在尝试使用工具提示自定义 android 搜索栏 如给定的图像 有没有办法在搜索栏中添加带有拇指的文本视图 或任何其他想法 Thanks 我们可以通过拇指的界限来做到这一点 并在seekbar的progressChange
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • 在 VideoView 开始播放之前,TextView 不会显示

    我编写了一个android应用程序 它有两个视图 TextView上方的VideoView 位于ScrollView内部 我遇到了一个问题 直到VideoView开始播放视频 TextView才显示 并且我有一个黑屏 这可能需要很长一段时间
  • 致命异常:GoogleApiHandler

    在我的项目中 我使用货币化服务 Vungle AppLovin 当我尝试加载广告时 出现此异常 E AndroidRuntime 致命异常 GoogleApiHandler 进程 kz ikar PID 3673 java lang NoS
  • FCM 主题是否适合更多用户?

    我对使用主题消息有点困惑 我的场景是根据通知触发一些作业 请帮助我更多地了解这一点 如果我们正在处理大量用户 则可以使用 FCM 主题向用户发送通知 我们可以只使用数据消息和主题消息吗 使用主题发送的消息是否保证送达 我在 FCM 文档中看
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy

随机推荐

  • SFML 瓦片地图碰撞

    I m making a 2D game in SFML and I m trying to figure out how to collide with tiles in a tilemap I ve written some code
  • 如何使用 HttpClient 从 Web Api 调用 PUT 方法?

    我想调用 Api 函数 1st 从第二个 Api 函数使用Http客户端 但我总是得到404 Error 第一个 API 函数 端点 http localhost xxxxx api Test public HttpResponseMess
  • 结构或类

    我正在开发 iPhone 3 1 3 应用程序 我有一堂课 叫做Object2D 带有字段和方法 代表一个形状 Object2D有一个表示其大小的字段 另一个表示其类型的字段 现在 我需要另一个名为Pattern 这是一组形状 在Patte
  • 当使用 *ngFor 渲染子项时,@ViewChildren Querylist 数组为空

    import Component OnInit ViewChildren from angular core import ChildComponent from child child component Component select
  • 查看从编译表达式生成的 IL 代码

    是否可以查看在表达式树上调用 Compile 时生成的 IL 代码 考虑这个非常简单的例子 class Program public int Value get set static void Main string args var pa
  • Camera2全屏预览和图像捕捉

    我正在使用示例代码 https github com googlesamples android Camera2Basic对于Camera2 我想知道如何才能全屏预览和捕获图像 This https stackoverflow com qu
  • Vue.js - element-ui el-table v-for 丢失了最后一项

    我想通过标题列表生成分组表头 但 v for 循环丢失了最后一项 html模板代码 div div
  • 使用 TypeScript 导入节点模块

    我正在努力让它发挥作用 但我似乎无法在任何地方找到解决方案 当尝试编译这个单文件应用程序时 import http require http http createServer function req res res writeHead
  • Laravel 或者哪里

    目前我正在 Laravel 中开发一个项目 但我陷入了困境 我想创建一个像这样的 SQL 语句 SELECT FROM SPITems WHERE publisher id AND feed id AND title LIKE OR des
  • PHP尝试获取非对象nodeValue的属性

    我正在尝试扫描所有 URL 即来自http 0 0 0 1 http 0 0 0 1 to http 255 255 255 255 http 255 255 255 255 并获取所有标题和描述 并将它们存储在数据库中 我知道这是错误的方
  • char '0x8' 这是什么字符?

    我的数据库中有大量数据 当我尝试读取数据的某个部分并生成一些 xml 并将其发送到 Web 服务时 出现以下异常 java lang IllegalArgumentException 中的字符 0x8 我猜这是一些坏数据 因为它已经完美运行
  • 如何使用 Perl 的 DBD::Pg 插入空字段?

    我有一个 Perl 脚本 根据管道分隔的文本文件将数据插入 Postgres 中 有时 字段为空 如预期 然而 Perl 将此字段设置为空字符串 并且 Postgres 插入语句失败 这是一段代码 use DBI Connect to th
  • 从不同节点访问分布式 mnesia 数据库

    我有一个包含不同表的 mnesia 数据库 我希望能够从不同的 Linux 终端访问这些表 我有一个函数叫做add record 它需要一些参数 比如name and id 我希望能够打电话add record on node1 and a
  • 如何更改括号中 PHP 标签的颜色

    我正在为 Brackets 开发一个自定义主题 http brackets io http brackets io 我想知道是否有一种方法可以专门更改 php 标签的颜色 下面星号之间的部分是红色的 我一直在查看几个主题 less 文件 但
  • Unity - 如何在可为 null int 的构造函数参数中传递 null

    我有一个以 nullable int 作为参数的类 public class Test public Test int p 如何使用 unity 解决它 传递 null 作为参数 myContainer RegisterType
  • 在 C++11 中显式删除成员函数后,是否仍然值得从不可复制的基类继承?

    在 C 11 中显式删除成员函数后 是否仍然值得从不可复制的基类继承 我说的是你私下继承一个基类的技巧 该基类具有私有或删除的复制构造函数和复制赋值 例如boost noncopyable http www boost org doc li
  • 重新平衡 Apache Storm 中的执行器

    我正在尝试重新平衡正在运行的 Apache Storm 0 9 5 拓扑中的 Bolt 的执行器数量 当我对 Nimbus 节点执行命令时 storm rebalance MyTopology n 2 e GreenBolt 4它接受命令行
  • SVG 描边和填充之间的空间

    用相同的颜色和颜色填充并描画一个圆圈stroke width超过一定尺寸 会在两个绘画区域 之间 产生一个奇怪的透明区域 到底是怎么回事 Chrome 和 Firefox 中都会发生这种情况 因此可能符合规范 但我在规范中找不到有关此行为的
  • Postgresql COPY TO STDIN With CSV 如何处理冲突更新?

    我想要做 on conflict time do update set name description 但我不知道当我将 stdin 与 csv 一起使用时 我不知道什么名称等于什么 和描述等于什么 table a xxx csv wit
  • 如何在 ExpandableListView 中保留滚动位置

    在我的应用程序中 我有一个派生自 ExpandableListActivity 的类 当我滚动内容 然后更改手机方向或编辑项目然后返回列表时 原始列表位置不会保留 我尝试了两种解决方案 类似于我最近在 ListActivity 派生类中成功