用卷轴放置在循环中保留滚动位置是行不通的



我正在尝试使用Onpause和on Resume方法来保留RecyClerview的滚动位置时,目的是使用意图启动另一个活动(在我的情况下是Web浏览器)

当我调试Onresume方法时," LastFirstVisiblePosition"是一个有效的整数,但是屏幕仍在滚动到RecyClerview的第一个元素。

任何帮助都将不胜感激,谢谢您。

编辑:我正在使用ViewPager,并且有多个回收器视图/片段

这是我的片段:

public class CultureFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<News>>, RecyclerViewAdapter.OnItemClicked {
    private String baseUrlString = "https://content.guardianapis.com/search?show-fields=headline,thumbnail,wordcount,trailText";
    private String LOG_TAG = CultureFragment.class.getName();
    public LoaderManager loaderManager;
    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private TextView mEmptyStateTextView;
    private View LoadingIndicator;
    private RecyclerView.LayoutManager layoutManager;
    private int lastFirstVisiblePosition;
    View rootView;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        setRetainInstance(true);
        //initialise rootview
        rootView = inflater.inflate(R.layout.word_recycler_view, container, false);
        //set up empty text view
        mEmptyStateTextView = rootView.findViewById(R.id.empty_view);
        mEmptyStateTextView.setVisibility(View.GONE);
        //Set up loading indicator
        LoadingIndicator = rootView.findViewById(R.id.loading_indicator);

        // initialising the recycler view and setting the adapter for adding items.
        recyclerView = rootView.findViewById(R.id.recycler_view);
        recyclerView.setAdapter(recyclerViewAdapter);

        //set the layout manager for item positioning in the list
        layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        //Setting up loadermanager if there is connection
        if (NewsActivity.isConnected) {
            loaderManager = getLoaderManager();
            loaderManager.initLoader(1, null, this);
        } else {
            recyclerView.setVisibility(View.GONE);
            LoadingIndicator.setVisibility(View.GONE);
            mEmptyStateTextView.setVisibility(View.VISIBLE);
            mEmptyStateTextView.setText(R.string.no_connection);
        }

        return rootView;
    }

    @Override
    public Loader<List<News>> onCreateLoader(int id, Bundle args) {
        Uri baseUri = Uri.parse(baseUrlString);
        Uri.Builder uriBuilder = baseUri.buildUpon();
        //Create the URL
        uriBuilder.appendQueryParameter("section", "culture");
        uriBuilder.appendQueryParameter("page-size", "20");
        uriBuilder.appendQueryParameter("api-key", "test");
        uriBuilder.appendQueryParameter("format", "json");
        uriBuilder.appendQueryParameter("orderBy", "newest");
        Log.e(LOG_TAG, " the url  " + uriBuilder.toString());
        return new NewsLoader(getContext(), uriBuilder.toString());
    }
    @Override
    public void onLoadFinished(android.support.v4.content.Loader<List<News>> loader, List<News> data) {
        //populate the recyclerview
        //dismiss the loading indicator
        LoadingIndicator.setVisibility(View.GONE);
        if (data != null) {
            recyclerViewAdapter = new RecyclerViewAdapter(getContext(), data);
            recyclerView.setAdapter(recyclerViewAdapter);

            //set the on click listener if the adapter is not NULL (here)
            recyclerViewAdapter.setOnClick(this);
        } else {
            // Remove recycler view, and set the no text textview
            recyclerView.setVisibility(View.GONE);
            mEmptyStateTextView.setVisibility(View.VISIBLE);
            mEmptyStateTextView.setText(R.string.no_stories);
        }
    }
    @Override
    public void onLoaderReset(android.support.v4.content.Loader<List<News>> loader) {
    }
    /*Custom on item click method, implemented in the recycler view Adapter*/
    @Override
    public void onItemClick(int position) {
        News news = recyclerViewAdapter.getItem(position);
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(news.getmWebUrl()));
        startActivity(i);
    }
    @Override
    public void onPause() {
        super.onPause();
        lastFirstVisiblePosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
    }
    @Override
    public void onResume() {
        super.onResume();
        if (lastFirstVisiblePosition > 0) {
            ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPosition(lastFirstVisiblePosition);
        }
    }
}

使用linearlayoutmanager和2种方法:

 linearLayoutManagerInstance.onSaveInstanceState()
 linearLayoutManagerInstance.onRestoreInstanceState()

最新更新