2017-12-26 1 views
0

다른 작업 (내 경우에는 웹 브라우저)을 실행하기 위해 인 텐트를 사용할 때 onPause 및 onResume 메서드를 사용하여 RecyclerView의 스크롤 된 위치를 유지하려고합니다.RecyclerView에서 scrollToPosition으로 스크롤 된 위치를 유지하는 것이 작동하지 않습니다.

"lastFirstVisiblePosition"은 onResume 메소드를 디버깅 할 때 유효한 정수이지만 화면은 여전히 ​​RecyclerView의 첫 번째 요소까지 스크롤됩니다.

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

편집 : 조각을 heres

/I는 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); 

     } 
    } 
} 
+0

무슨 일이 일어나는가, recyclerview는 어떤 이유로 든 위로 스크롤하고있다. – tipi

답변

-1

사용 LinearLayoutManager과 2 개 방법 : 사실

linearLayoutManagerInstance.onSaveInstanceState() 
linearLayoutManagerInstance.onRestoreInstanceState() 
+0

안녕하세요 호세, 왜이 일에 onpause 및 onrestore가 작동하지 않습니까? – tipi

+0

올바른 방법을 사용해야합니다 @tipi linearlayoutmanager에는 onsave 및 restore를 사용하는 인스턴스가 있습니다. onPause 및 onRestore는 recyclerview뿐만 아니라 모든 앱용입니다. – josedlujan

관련 문제