সম্পাদনা: ঠিক একই আপাত অবস্থানটি পুনরুদ্ধার করতে , যেমনটি হয়েছিল ঠিক তেমন দেখতে, আমাদের কিছুটা আলাদা করতে হবে (সঠিক স্ক্রোলওয়াইয়ের মানটি পুনরুদ্ধার করার জন্য নীচে দেখুন):
অবস্থানটি সংরক্ষণ করুন এবং এটি অফসেট করুন:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
int firstItem = manager.findFirstVisibleItemPosition();
View firstItemView = manager.findViewByPosition(firstItem);
float topOffset = firstItemView.getTop();
outState.putInt(ARGS_SCROLL_POS, firstItem);
outState.putFloat(ARGS_SCROLL_OFFSET, topOffset);
এবং তারপরে স্ক্রোলটি পুনরুদ্ধার করুন:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
এটি তালিকাটিকে তার সঠিক আপাত অবস্থানে পুনরুদ্ধার করে । দৃশ্যত কারণ এটি ব্যবহারকারীর কাছে একই দেখাবে, তবে এর একই স্ক্রোলওয়াইয়ের মান থাকবে না (ল্যান্ডস্কেপ / প্রতিকৃতি বিন্যাসের মাত্রায় সম্ভাব্য পার্থক্যের কারণে)।
মনে রাখবেন এটি কেবল লিনিয়ারলআউটআমনেজারের সাথে কাজ করে।
--- সঠিক স্ক্রোলওয়াই কীভাবে পুনরুদ্ধার করবেন তার নীচে, যা সম্ভবত তালিকাটি অন্যরকম দেখাচ্ছে ---
এর মতো একটি অনস্ক্রোললিস্টার প্রয়োগ করুন:
private int mScrollY;
private RecyclerView.OnScrollListener mTotalScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrollY += dy;
}
};
এটি mScrolY এ সর্বদা সঠিক স্ক্রোল অবস্থান সংরক্ষণ করবে।
আপনার বান্ডলে এই ভেরিয়েবলটি সংরক্ষণ করুন এবং এটিকে রাষ্ট্রের পুনরুদ্ধারে একটি ভিন্ন ভেরিয়েবলে পুনরুদ্ধার করুন , আমরা এটিকে এমস্টেটস্ক্রোলই বলব।
রাষ্ট্র পুনরুদ্ধারের পরে এবং আপনার পুনর্ব্যবহারযোগ্য ভিউ এর সাথে এর সমস্ত ডেটা পুনরায় সেট করেছে:
mRecyclerView.scrollBy(0, mStateScrollY);
এটাই.
সাবধান, আপনি যে স্ক্রোলটিকে অন্য কোনও ভেরিয়েবলে পুনরুদ্ধার করেছেন, এটি গুরুত্বপূর্ণ, কারণ অনস্ক্রোললিস্টারকে .scrolBy () দিয়ে ডাকা হবে এবং পরবর্তীকালে এমস্টেটস্ক্রোলওয়াইতে সঞ্চিত মানটিতে এমস্ক্রোলওয়াই সেট করবে। আপনি যদি এটি না করেন তবে স্ক্রোলওয়াইয়ের দ্বিগুণ স্ক্রোল মান হবে (কারণ অনস্ক্রোললিস্টনার ডেল্টাসের সাথে কাজ করে, পরম স্ক্রোলগুলির সাথে নয়)।
ক্রিয়াকলাপগুলিতে রাষ্ট্রীয় সঞ্চয় এইভাবে অর্জন করা যায়:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
এবং আপনার অনক্রিটে () এ কলটি পুনরুদ্ধার করতে:
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
খণ্ডগুলিতে রাষ্ট্রীয় সঞ্চয় একইভাবে কাজ করে তবে প্রকৃত রাষ্ট্রীয় সঞ্চয় করতে কিছুটা অতিরিক্ত কাজ প্রয়োজন, তবে এর সাথে প্রচুর নিবন্ধ রয়েছে, সুতরাং কীভাবে স্ক্রোলটি সংরক্ষণের নীতিগুলি খুঁজে পেতে আপনার সমস্যা হওয়া উচিত নয় এবং এটি পুনরুদ্ধার একই থাকে।