当片段消失时,停止ListView滚动

时间:2014-07-18 23:05:25

标签: android android-fragments android-listview scroll ondestroy

我有一个片段,使用ListView显示最多数百个项目的列表。当用户导致列表的持久滚动时,当事情处于运动状态时,按下Back,会发生坏事(列表适配器的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停止滚动来延迟片段破坏是不可接受的 - 用户希望立即响应Back press。)

1 个答案:

答案 0 :(得分:1)

使用时

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

我认为getActivity()会返回null 解决这个问题:

  1. 全局定义LayoutInflaterAdapter
  2. 初始化适配器构造函数中的LayoutInflater
  3. LayoutInflater方法中使用getView()
  4. 另外,我建议您始终将Adapter定义为static class或新Java file