如何在具有两个片段的活动中保存android recycler视图状态(滚动位置)

时间:2019-04-04 09:15:33

标签: android android-fragments android-recyclerview

我是Android的新手,第一步是构建一个应用程序,以便在手机中运行,并在其中放置两个片段。第一个片段具有应该代表文章标题的项目的回收者视图。当我单击一个时,第二个片段将打开并显示文章的标题(在文本视图中)和内容(在另一文本视图中)(为简单起见,我将文章标题作为假标题,有一个设置,该设置不会显示内容,但也会在内容文本视图中显示标题。

我要保存回收站视图的滚动位置。

当我向下滚动时,在屏幕顶部具有与第一个标题不同的文章标题,我选择了一个文章,然后打开第二个带有所需内容的片段,这没关系。当我旋转到风景时,相同的片段包含相同的内容,好的。所以:

1)当我从横向按下后退按钮,返回到第一个片段时,对回收者视图的设置相同,确定;

2)当我再次旋转至肖像时,保留在第二个片段上,也可以。现在,如果按“后退”按钮返回到第一个片段,回到文章列表,则回收站视图未设置为从最初滚动到的项目开始。我该怎么办?

我在第一个片段中有这段代码,其中包含回收者视图:

@Override
public void onSaveInstanceState(Bundle state) {
    int lastFirstVisiblePosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
    state.putInt(Articles.RECYCLER_POSITION_KEY, lastFirstVisiblePosition);

    super.onSaveInstanceState(state);
}

@Override
public void onActivityCreated(Bundle state) {
    super.onActivityCreated(state);

    if (state != null) {
        int lastFirstVisiblePosition = state.getInt(Articles.RECYCLER_POSITION_KEY);
        ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPosition(lastFirstVisiblePosition);
    }
}

我想念什么?谢谢。

[ EDIT ]在我的听众中是这样,用于调用第二个片段:

ArticleReaderFrag newFragment = new ArticleReaderFrag();
Bundle args = new Bundle();
args.putString(NEW_FRAG_TITLE_KEY, item);
args.putString(NEW_FRAG_BODY_KEY, itemb);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.main_activity, newFragment);
transaction.addToBackStack(null);

transaction.commit();

1 个答案:

答案 0 :(得分:0)

重复使用片段

首次启动活动时,创建一个Fragment的新实例,并使用TAG将其保存到FragmentManager。方向更改后重新创建活动时。使用标签检索旧实例。

这是您应该在活动中使用的示例代码。

System.out.println(user.getAddress.getAddressLineOne);
System.out.println(user.getAddress.getCity);

如何保存滚动位置?

默认情况下会发生这种情况。阅读此answer了解更多详细信息。

  

编辑

我相信这是您的方法

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_activity);
    fragmentManager = getSupportFragmentManager();

    if(savedInstanceState==null) {

        userFragment = UserNameFragment.newInstance();
        fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
    }
    else {
        userFragment = fragmentManager.findFragmentByTag("TAG");
    }

}

保存旋转位置,并使用该位置加载特定片段。
更改方向后重新创建活动时调用方法

public createSecondFragment(int position){

     ArticleReaderFrag newFragment = new ArticleReaderFrag();
     Bundle args = new Bundle();
     args.putString(NEW_FRAG_TITLE_KEY, item);
     args.putString(NEW_FRAG_BODY_KEY, itemb);
     newFragment.setArguments(args);

     FragmentTransaction transaction = 
     getSupportFragmentManager().beginTransaction();

     transaction.replace(R.id.main_activity, newFragment);
     transaction.addToBackStack(null);

     transaction.commit();

}