当前位置: 首页 > 知识库问答 >
问题:

当片段消失时,停止正在进行的ListView滚动

鲁品
2023-03-14

我有一个片段,它使用ListView显示多达数百个项目的列表。当用户对列表进行长时间滚动,并且在列表运行时按下后退键时,就会发生不好的事情(列表适配器的getView()中的空指针崩溃)。到目前为止,我找到了以下解决方法:

@Override
public void onDestroyView() {
    super.onDestroyView();
    // prevent a crash when Back is pressed while a long list is still being scrolled
    mAdapter.clear();
    Log.d(TAG, "Cleared adapter");
}

实现这一点的诀窍是让适配器使用源项列表的克隆:

    mAdapter = new ListAdapter((MyListType)mMyList.clone());
    setListAdapter(mAdapter);

否则,调用mAdapter。clear()将清除源项列表,因此当在方向更改时重新创建片段时,列表上将不会显示任何项。然而,克隆如此大量的项目,即使是浅拷贝,也是一项昂贵的操作,我宁愿避免。

作为另一种方法,我在onDestroyView()中尝试了

mListView.setScrollContainer(false);

但它也导致了坠机。

有没有比上述解决方法更好的方法可以在滚动过程中彻底销毁ListView?(提示:通过安装监听器等待ListView停止滚动来延迟片段销毁是不可接受的,用户希望立即对反按做出响应。)

共有1个答案

聂建茗
2023-03-14

当您使用

convertView = getActivity().getLayoutInflater().inflate(...) 

我认为getActivity()返回null
要解决此问题:

  1. 全局(在适配器中)定义布局平坦器

此外,我建议您始终将适配器定义为静态类或新的Java文件

 类似资料:
  • 我有一个对象Foo,它可以使用片段(efFraank)进行配置。Foo类包含对FooFraank的静态引用和方法public Fraank getConfigurationFraank();此方法将当前对象分配给FooFraank并返回它。 足球碎片大致如下: 当我第一次在对象foo1上使用片段时,一切都很好。显示正确的信息,一切正常。 当我在另一个对象foo2上第二次使用该片段时,打开该片段会导

  • 问题内容: 我已经设置了一个片段,当单击该片段时会将页面部分滚动到视图中,问题是,如果用户想在动画中间滚动,则滚动会有点断断续续。 如果用户手动滚动,如何停止jquery动画? 问题答案: 将功能更改为此: 这将: 如果用户手动滚动(仅在动画过程中),则停止动画 不会妨碍您正常的jQuery动画,例如其他一些答案 一些额外的信息: 您为什么要绑定所有这些事件?“滚动鼠标滚轮等…” 有许多不同类型的

  • 我正在创建一个BLE应用程序,需要连续启动和停止扫描预定义的时间间隔。我实现它的方式是使用两个Runnable,它们相互调用,如下所示: 我正在尝试开始连续扫描并在单击按钮时暂停。开始按钮可以启动过程,但我无法停止扫描。 如果在停止间隔期间按下停止按钮,扫描将停止。但是,如果在扫描可运行状态下按stop按钮,则会删除stopScan可运行状态下的回调,同时保持扫描可运行状态持续运行。我需要的是两个

  • 我将CoordinatorLayout与AppBarLayout和CollapsingToolbarLayout一起使用。还有一个内容的NestedScrollView。当我在CollapsingToolbarLayout上滚动时,当Collapsing工具栏Layout折叠时,滚动停止。我想要的是继续滚动NestedScrollView的内容。当我在NestedScrollView上滚动时,它会

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 我有这个错误。有人可以帮帮我吗,我认为这是关于触摸听众的事情......当我松开手指时发生错误。 当我尝试运行此代码时,就会发生这种情况: 来自触摸听众: 这两种方法: