0

I have this code. It displays two recycler views and wants to store their scroll positions for the rotation purpose. So here is my code.

public class DetailActivity extends AppCompatActivity implements DetailViewInteface, TrailersAdapter.TrailersAdapterOnClickHandler {
public static final String IMAGE_URL = "http://image.tmdb.org/t/p/";
public static final String IMAGE_SIZE_185 = "w185";
private static final String TAG = "DetailActivity";

private static final String TRAILERS_LAYOUT = "DetailsActivity.trailer.layout";
private static final String REVIEWS_LAYOUT = "DetailsActivity.review.layout";

private Parcelable listState1;
private Parcelable listState2;


@BindView(R.id.movie_image)
ImageView movieImageTv;

String mImage;

@BindView(R.id.movie_title)
TextView movieTitleTv;

String mTitle;

@BindView(R.id.movie_rating)
TextView movieRatingTv;

double mRating;

@BindView(R.id.movie_date)
TextView movieDateTv;

String mReleaseDate;

@BindView(R.id.movie_overview)
TextView movieOverviewTv;

String mMovieOverview;

@BindView(R.id.recyclerview_trailers)
RecyclerView trailersRecyclerView;

TrailersAdapter trailersAdapter;

@BindView(R.id.recyclerview_reviews)
RecyclerView reviewsRecyclerView;

ReviewAdapter reviewAdapter;

int recyclerViewOrientation = LinearLayoutManager.VERTICAL;

private Parcelable mLayoutManagerSavedState;


DetailPresenter detailPresenter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    ButterKnife.bind(this);

    setMVP();
    setUpViews();
    detailPresenter.getMovieDetails();
    detailPresenter.getMovieTrailers();
    detailPresenter.getMovieReviews();



}

public void setMVP(){
    detailPresenter = new DetailPresenter(this,this);
}

public void setUpViews(){
    trailersRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    trailersRecyclerView.addItemDecoration(new MyDividerItemDecoration(this,recyclerViewOrientation,16));

    reviewsRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    reviewsRecyclerView.addItemDecoration(new MyDividerItemDecoration(this,recyclerViewOrientation,16));
}
@Override
public void dipsplayMovieDetails(Movie movie) {
      //movieTitleTv.setText(movieTitle);
      //movieDescriptionTv.setText(movieDesc);

      mImage = movie.getPosterPath();
      Picasso.with(this).load(IMAGE_URL + IMAGE_SIZE_185 + mImage).into(movieImageTv);

      mTitle = movie.getTitle();
      movieTitleTv.setText(mTitle);

      mRating = movie.getVoteAverage();
      movieRatingTv.setText("Rating: " + mRating);

      mReleaseDate = movie.getReleaseDate();
      movieDateTv.setText("Date: " + mReleaseDate);

      mMovieOverview = movie.getOverview();
      movieOverviewTv.setText(mMovieOverview);

}

@Override
public void dipsplayMovieTrailers(TrailersResponse trailersResponse) {
    Log.d(TAG, "Trailers size: " + String.valueOf(trailersResponse.getTrailers().size()));
    trailersAdapter = new TrailersAdapter(trailersResponse.getTrailers(),DetailActivity.this,this);
    trailersRecyclerView.setAdapter(trailersAdapter);
}

@Override
public void displayMovieReviews(ReviewsResponse reviewsResponse) {

    if(reviewsResponse != null) {
        Log.d(TAG, String.valueOf("Reviews size: " + reviewsResponse.getReviews().size()));
        reviewAdapter = new ReviewAdapter(reviewsResponse.getReviews());
        reviewsRecyclerView.setAdapter(reviewAdapter);
    }else{
        Toast.makeText(DetailActivity.this,"No reviews found!",Toast.LENGTH_LONG).show();
    }
}

@Override
public void displayError(String s) {
    showToast(s);
}

@Override
public void showToast(String s) {
    Toast.makeText(DetailActivity.this,s,Toast.LENGTH_LONG).show();
}

@Override
public void onClick(String trailerKey) {
    Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + trailerKey));
    Intent webIntent = new Intent(Intent.ACTION_VIEW,
            Uri.parse("http://www.youtube.com/watch?v=" + trailerKey));
    try {
        startActivity(appIntent);
    } catch (ActivityNotFoundException ex) {
        startActivity(webIntent);
    }
}


@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable(REVIEWS_LAYOUT,reviewsRecyclerView.getLayoutManager().onSaveInstanceState());
    outState.putParcelable(TRAILERS_LAYOUT,trailersRecyclerView.getLayoutManager().onSaveInstanceState());



  }
}

I use the onSaveInstanceState method. But now I need to restore in the scroll positions of recyclerviews.

I am using the onRestoreInstanceState as below but nothing happens. The rotation gets me to the top of the screen.

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    savedInstanceState.getParcelable(REVIEWS_LAYOUT);
    savedInstanceState.getParcelable(TRAILERS_LAYOUT);
}

So how can I fix that bug?

Thanks,

Theo.

Theo
  • 3,099
  • 12
  • 53
  • 94

1 Answers1

0
void addOnScrollListener (RecyclerView.OnScrollListener listener)

This is a listener that will be notified of any changes in scroll state or position for a recycler view.

Refer to this answer for an example implementation.

For more on how to use it correctly.

Kaveri
  • 1,060
  • 2
  • 12
  • 21