【问题标题】:How can I returned to the same index of List View after closing the app and open it again关闭应用程序并再次打开后如何返回到列表视图的相同索引
【发布时间】:2021-11-01 01:55:08
【问题描述】:

我有一个很长的 ListView,用户可以在返回上一个屏幕之前滚动它。当用户关闭应用程序并再次打开时,我希望将列表滚动到与之前相同的位置。关于如何实现这一目标的任何想法

我尝试了很多方法,但都是徒劳的

【问题讨论】:

    标签: android


    【解决方案1】:

    所有功劳归@Gabe Sechan 所有。根据文档活动的生命周期 -

        onStart()
    
        onRestart()
    
        onResume()
    
        onPause()
    
        onStop() - Killable
    
        onDestroy() - Killable
    

    对于那些被标记为可终止的方法,在该方法返回后,托管该活动的进程可能随时被系统终止,而无需执行另一行代码。因此,您应该使用 onPause() 方法将任何持久性数据(例如用户编辑)写入存储。

    你从@Gabe Sechan 那里得到了答案。

    我想补充一点,你可以检查一下。你问-

    关闭应用重新打开后如何返回列表视图的同一索引

    如果用户强制关闭/杀死您的应用程序,则不会调用 onPause()/onStop()/onDestroy()。所以在onPause() 中存储数据会丢失。因此,您可以实现列表视图的setOnScrollListeneronScrollStateChanged,以检查用户是否停止滚动,否则不存储位置。在创建活动时检索保存的数据。示例代码 -

        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.activity_main);
    
        ListView listView;
        listView = (ListView) findViewById(R.id.listView);
    
        SharedPreferences defPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        int position = defPref.getInt("position", 0);
        listView.setSelection(position);
    
        listView.setOnScrollListener(new ListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if (scrollState == 0)
                    Log.i("ZI", "scroll stopped");
                //store
                ListView listView;
                listView = (ListView) findViewById(R.id.listView);
                int position = listView.getFirstVisiblePosition();
    
                SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                SharedPreferences.Editor editor = pref.edit();
                editor.putInt("position", position);
                editor.commit();
    
            }
    
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    
            }
    
        });
    
    
    }
    

    在这种情况下,我们不会在 onPause() and onResume() 上存储/检索数据。

    【讨论】:

    • 谢谢大家,我使用共享参考修复了它
    【解决方案2】:
    onPause() {
       int position = listView.getFirstVisiblePosition()
       //Write position to shared preferences
    }
    
    onResume() {
      int position = //read position from shared preferences
      listView.setSelection(position)
    }
    

    onPause 代码将使最顶部的项目可见(请注意它可能部分可见)。 onResume 代码会将列表视图滚动到该项目。

    【讨论】:

    • 您好,感谢您的帮助,我只是初学者,所以当您说//将位置写入共享偏好时,我不明白是什么意思,可能类似于这样的长文本 = lv.getItemIdAtPosition(position) ;也没有必要避免@override
    • 这是伪代码,不是完整代码。我告诉你该怎么做,你需要填写空白。查看如何读取和写入共享首选项,这是 android 系统中用于存储设置的常见且重要的部分。此外,@Override 从来都不是必需的,尽管它可以找到一类拼写错误并节省调试时间。
    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2013-12-04
    • 2011-10-02
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多