当按下返回按钮时,listview 会顶部。如何解决?

Posted

技术标签:

【中文标题】当按下返回按钮时,listview 会顶部。如何解决?【英文标题】:When press back button listview going top. How to fix that? 【发布时间】:2020-01-09 17:47:33 【问题描述】:

在我的代码中有两个片段。列表页面和详细信息页面。列表页面上有很多字母项目。当我单击某些项目打开详细信息页面时。但是当我按下后退按钮时,列表不会保持相同的位置。它到达顶部。我搜索了一些解决方案,但我认为这不是常见问题。我找不到不同的答案。有人帮我吗?

【问题讨论】:

【参考方案1】:

乍一看,这似乎是您拨打的电话之一:dictionaryFragment.resetDatasource(source);

这会将您的ListView 上的Adapter 重置为全新的ArrayAdapter。这会将ListView 重置为顶部,因为适配器是一个全新的对象。 ListView 不再对旧的 ArrayAdapter 有任何想法,因此重置为顶部。

public void resetDatasource (ArrayList<String> source)
        mSource=source;
        adapter = new ArrayAdapter<String>(getContext(),R.layout.kelimelistesi, mSource);
        dicList.setAdapter(adapter);

    

而不是调用

        adapter = new ArrayAdapter<String>(getContext(),R.layout.kelimelistesi, mSource);
        dicList.setAdapter(adapter);

你应该做更多这样的事情:

public class DictionaryFragment ... 
    private Adapter mAdapter;

    public View onCreateView(...) 
        // Init the layout here

        // Put some other ArrayList here if you have one initially, else an empty one to start
        mAdapter = new ArrayAdapter<String>(getContext(), R.layout.kelimelistesi, new ArrayList<String>());

        dicList.setAdapter(mAdapter);
    

    public void resetDatasource(ArrayList<String> source) 
        mAdapter.clear();
        mAdapter.addAll(source);
        mAdapter.notifyDataSetChanged();
    

    ...

现在的区别在于 same mAdapter 实例始终绑定到 dicList,但只有要显示的基础数据发生了变化。将 ListView/RecyclerView 的 Adapter 视为一个接受一些输入数据并将其绑定到一些 UI 元素的类。在这种情况下,ArrayAdapter 中的每个 String 都会显示在一些 UI 元素中,例如 TextView 或其他。

同样重要:请注意,我们调用notifyDataSetChanged()之后我们已经清除了旧数据并添加了所有新数据。这将有助于避免一次尝试一个元素时出现闪烁和滚动问题。

【讨论】:

您好 MCLLC 非常感谢您的回答。我尝试了您所说的并更改了这样的代码(您可以在我编辑的帖子中看到)但现在我收到错误错误:找不到符号方法 clear() 错误:找不到符号方法 addAll(ArrayList) 错误:不能查找符号方法 notifyDataSetChanged() 所有树 .clear(); .addAll(源);和 NotifyDataSetChanged();是红色的 它现在可以工作了,我错过了一些东西。 MCLLC 非常感谢,你就像一个救世主:) 没问题。尽管我确实想提一下我注意到的其他几件事:(1)您正在为 ListView 初始化两个适配器(一个在 onCreateView() 中,一个在 onViewCreated() 中 - 只需使用 onCreateView() 中的一个)以后可能会导致问题,(2) 在向用户显示时,我会推荐字符串资源而不是原始文本字符串(它更容易本地化为其他语言并具有其他优势)。

以上是关于当按下返回按钮时,listview 会顶部。如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 动画列表:有条件地添加 ListView 项

当按下相应视图控制器的 tabBar 图标时,如何将 collectionView 带回顶部?

Mat-icon:当按下一个按钮时,所有的图标都会改变

将下一个和上一个按钮添加到 ListView

两个按钮,一键

当按下后退按钮并打开导航抽屉时,我的应用程序关闭而不是关闭抽屉