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

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

【问题讨论】:

    标签: java android listview android-fragments


    【解决方案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) 在向用户显示时,我会推荐字符串资源而不是原始文本字符串(它更容易本地化为其他语言并具有其他优势)。
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多