【问题标题】:how to prevent recyclerview scroll to top automatically in fragment onResume如何防止recyclerview在片段onResume中自动滚动到顶部
【发布时间】:2020-07-24 09:50:07
【问题描述】:

我的 recyclerview 和 Fragments 遇到了问题。这让我发疯了。我的英语不太好,但我试着解释一下。 我有一个带有 2 个不同片段的视图寻呼机,这两个片段加载了具有不同数据的相同片段。这个内部片段将数据加载到 recyclerview 。 加载数据在内部片段 OnResume() 方法上运行(首先检查适配器是否为空,然后将数据加载到 recyclerview 。) 问题就在这里,当我单击 recyclerview 项目时,它开始新的活动,当我从活动返回到片段 recyclerview 跳转到列表顶部时。但是它没有加载新数据。 我试图在 onPause 方法上保存 recyclerview 状态并在 onResume 上恢复它,但它不起作用。如果我延迟执行它可以工作,但首先它跳到顶部,然后返回到最后一个项目,它一点也不好。波纹管代码

/* new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
               // if(state !=null)
                recyclerViewFragmentChannel.getLayoutManager().onRestoreInstanceState(mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE));
            }
        }, 1000);*/

我想知道是否有人可以帮助我克服这个问题。我想防止 recyclerview 跳转到顶部。我附上了我的内部片段代码,以使我的解释更清楚。

我的内心片段:

public class Fragment_Channels extends Fragment {

private static final String ARG_COUNT = "param1";
private Integer counter;
private Adapter adapter;
private View view;
private List<Fragment> fragmentsList;
private RecyclerView recyclerViewFragmentChannel;
private GridLayoutManager layoutManagerPortrait, layoutManagerLandScape;
private Parcelable state;
private Bundle mBundleRecyclerViewState;
private String KEY_RECYCLER_STATE = "recycler_state";

public Fragment_Channels() {
    // Required empty public constructor
}

public static Fragment_Channels newInstance(Integer counter) {
    Fragment_Channels fragment = new Fragment_Channels();
    Bundle args = new Bundle();
    args.putInt(ARG_COUNT, counter);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    fragmentsList = getActivity().getSupportFragmentManager().getFragments();

    if (getArguments() != null) {
        counter = getArguments().getInt(ARG_COUNT);
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (view == null) {

        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_channels, container, false);

        recyclerViewFragmentChannel = view.findViewById(R.id.recyclerViewFragmentChannel);
        
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

            layoutManagerLandScape = new GridLayoutManager(view.getContext(), 5);
            recyclerViewFragmentChannel.setLayoutManager(layoutManagerLandScape);

           
        } else {
            layoutManagerPortrait = new GridLayoutManager(view.getContext(), 2);
            recyclerViewFragmentChannel.setLayoutManager(layoutManagerPortrait);
        }
    }
    return view;
}


@Override
public void onPause() {
    super.onPause();
    mBundleRecyclerViewState = new Bundle();
    state = layoutManagerPortrait.onSaveInstanceState();
}

@Override
public void onResume() {
    super.onResume();

    if ((recyclerViewFragmentChannel.getAdapter() == null)) {

    //Load data to recyclerview here
       
    } else {
        
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
               // if(state !=null)
                layoutManagerPortrait.onRestoreInstanceState(mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE));
            }
        }, 1000);
    }
}

【问题讨论】:

    标签: android android-fragments android-recyclerview


    【解决方案1】:

    如果您想让RecyclerView 与转到第二个片段之前的位置相同,您可以将实际位置保存在共享首选项中。当您回到第一个片段时,只需从共享首选项中加载值并使用方法滚动到给定位置。 Scroll RecyclerView programmatically

    recyclerView.smoothScrollToPosition(savedPosition); // if You want smooth scroll 
    
    recyclerView.scrollToPosition(savedPosition); // if You want instant scroll 
    

    【讨论】:

    • 它没有帮助,因为它没有立即运行而没有延迟,我应该延迟运行。并且延迟它是相同的保存和恢复实例。我正在寻找一些可以防止 recyclerview 在 onresume 方法上自动移动的解决方案。
    【解决方案2】:

    在recyclerview的外部或父布局中添加android:descendantFocusability="blocksDescendants"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多