Android 如何在不更改前一个活动状态的情况下更改活动?

Android 如何在不更改前一个活动状态的情况下更改活动?,android,android-activity,Android,Android Activity,我制作了一个应用程序,用3种不同的活动来改变壁纸 这是一个类别列表 特定类别的壁纸列表 查看并设置选定的墙纸 场景 例如,当我在1°活动中向下滚动,直到结束并单击某个类别时,我将转到2°活动,但当我返回时,我希望是1°活动的结束,而不是我在开始时发现自己。(也包括从2°活动到3°活动和反向活动) 那么如何保存以前的状态呢?我用RecyclerView列了这个清单。 (我是安卓工作室的新手,抱歉,糟糕的英语不是我的第一语言) 如果我不够清楚,我的应用程序: 这是壁纸列表的代码,2°活动 @Ove

我制作了一个应用程序,用3种不同的活动来改变壁纸

  • 这是一个类别列表
  • 特定类别的壁纸列表
  • 查看并设置选定的墙纸
  • 场景

    例如,当我在1°活动中向下滚动,直到结束并单击某个类别时,我将转到2°活动,但当我返回时,我希望是1°活动的结束,而不是我在开始时发现自己。(也包括从2°活动到3°活动和反向活动)

    那么如何保存以前的状态呢?我用RecyclerView列了这个清单。 (我是安卓工作室的新手,抱歉,糟糕的英语不是我的第一语言)

    如果我不够清楚,我的应用程序:

    这是壁纸列表的代码,2°活动

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_wallpaper);
    
        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        toolbar.setTitle(Common.CATEGORY_SELECTED);
        setSupportActionBar(toolbar);
    
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    
        recyclerView = (RecyclerView)findViewById(R.id.recycler_list_wallpaper);
        recyclerView.setHasFixedSize(true);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
        recyclerView.setLayoutManager(gridLayoutManager);
    
        loadBackgroundList();
    
    }
    
    private void loadBackgroundList(){ //....
    }
    
    @Override
    protected void onStart(){
        super.onStart();
        if(adapter!=null)
            adapter.startListening();
    }
    
    @Override
    protected void onResume(){
        super.onResume();
        if(adapter!=null)
            adapter.startListening();
    }
    
    @Override
    protected void onStop(){
        if(adapter!=null)
            adapter.stopListening();
        super.onStop();
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        if(item.getItemId()== android.R.id.home)
            finish(); //Close activity when click Back button
        return  super.onOptionsItemSelected(item);
    
    }  
    
    这是我的适配器

    public MyFragmentAdapter(FragmentManager fm, Context context){
        super(fm);
        this.context = context;
    }
    
    @Override
    public Fragment getItem(int position){
        if(position==0)
            return CategoryFragment.getInstance();
        else
            return null;
    }
    
    @Override
    public int getCount(){
        return 1;
    }
    
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Category";
        }
        return "";
    }  
    

    我猜您在
    onResume
    中刷新了活动中的列表,因此您将得到一个新的项目列表,该列表将滚动到顶部。这很正常

    如果您没有在
    onResume
    中刷新列表,您应该会没事的。另一种方法是:保存单击项目的索引,在返回列表并刷新后,调用:
    recyclerview.scrollToPosition(oldPosition)
    I只需更改即可

    protected void onStop(){
        if(adapter!=null)
            adapter.stopListening();
        super.onStop();
    }
    


    一切都很好!谢谢你的提示

    嗨!请向我们展示列表活动的代码。听起来好像每次显示活动时都要初始化列表(可能在onResume中)。或者可能您有一些配置更改。无论哪种方式,我们都需要更多信息来帮助您在“开发人员选项”中启用“杀死活动”选项吗?根据我的经验,除非重新创建活动,否则状态和滚动位置会被保存Hello Stein,欢迎使用SO!请分享一点您的代码,特别是在您配置RecyclerView和适配器的地方;没有它,这只是一个猜测游戏,每个人都在试图找出可能发生的事情。我们有想法,但如果没有具体的代码和你做过/没有做过的事情,那就困难多了。谢谢您想要实现的行为是默认行为。该活动负责在保存InstanceState期间保存视图的状态(这仅适用于在XML中设置了id的视图,但很可能您已经为RecyclerViews设置了id)。因此,如果这不起作用,这意味着当您返回到第一个活动时,您正在使用视图做一些事情。例如,如果您在活动的
    onResume
    中调用
    setAdapter
    notifyDataSetChanged
    或类似操作,这将重置滚动位置。因此,请仔细检查恢复act 1时执行的代码。我添加了列表活动代码和适配器,自从我安装Android Studio以来,我没有更改任何选项
    protected void onStop(){
        super.onStop();
    }