![](/img/trans.png)
[英]How to save and restore scrolling position of the RecyclerView in a fragment when coming back from other activity to the same fragment?
[英]How can I retain recyclerview scroll position when i back pressed from activity to fragment and when switching fragments in bottom nav bar
我將5個片段放置在帶有底部導航欄的主要活動中,這些片段具有回收站視圖,當我從底部導航欄切換時,先前的片段回收站視圖的滾動位置會自動重置為頂部,並且我想保留先前的滾動位置。
當我單擊碎片回收器視圖項目時,它進入活動狀態;當我從活動窗體中按下該鍵時,先前的碎片回收器視圖滾動位置重置為頂部,我也想保留它。
這是片段代碼
public class Assassin_Fragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
RecyclerView recyclerView;
Ass_Adapter ass_adapter;
FirebaseDatabase database;
DatabaseReference reference;
ProgressBar fpgbar;
public Assassin_Fragment() {
}
public static Assassin_Fragment newInstance(String param1, String param2) {
Assassin_Fragment fragment = new Assassin_Fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_assassin_, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.rcview);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
fpgbar = (ProgressBar) view.findViewById(R.id.fpgbar);
FirebaseRecyclerOptions<Assassin_Models> options = new FirebaseRecyclerOptions.Builder<Assassin_Models>().setQuery(FirebaseDatabase.getInstance().getReference().child("Assassin"), Assassin_Models.class).build();
ass_adapter = new Ass_Adapter(options, getContext());
recyclerView.setAdapter(ass_adapter);
reference = database.getInstance().getReference().child("Assassin");
reference.keepSynced(true);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.getChildrenCount() > 0) {
fpgbar.setVisibility(View.GONE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
return view;
}
@Override
public void onStart() {
super.onStart();
ass_adapter.startListening();
}
@Override
public void onStop() {
super.onStop();
ass_adapter.stopListening();
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.about_us_menu, menu);
MenuItem menuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
searchView.setQueryHint("Search heros...");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
processsearch(s);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
processsearch(s);
return false;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
private void processsearch(String s) {
FirebaseRecyclerOptions<Assassin_Models> options = new FirebaseRecyclerOptions.Builder<Assassin_Models>().setQuery(FirebaseDatabase.getInstance().getReference().child("Assassin").orderByChild("heroname").startAt(s).endAt(s + "\uf8ff"), Assassin_Models.class).build();
ass_adapter = new Ass_Adapter(options, getContext());
ass_adapter.startListening();
recyclerView.setAdapter(ass_adapter);
}
}
這是底部導航代碼
getSupportFragmentManager().beginTransaction().replace(R.id.container, new Herotablayout()).addToBackStack(null).commit();
bottomNavigationView = findViewById(R.id.chipnav);
integerDeque.push(R.id.champs);
loadFragment(new Herotablayout());
bottomNavigationView.setSelectedItemId(R.id.champs);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (integerDeque.contains(id)) {
if (id == R.id.champs) {
if (integerDeque.size() != 1) {
if (flag) {
integerDeque.addFirst(R.id.champs);
flag = false;
}
}
}
integerDeque.remove(id);
}
integerDeque.push(id);
loadFragment(getFragment(item.getItemId()));
return true;
}
});
}
private Fragment getFragment(int itemId) {
switch (itemId) {
case R.id.champs:
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Herotablayout();
case R.id.items:
bottomNavigationView.getMenu().getItem(1).setChecked(true);
return new Itemstablayout();
case R.id.spells:
bottomNavigationView.getMenu().getItem(2).setChecked(true);
return new Spelltsablayout();
case R.id.runes:
bottomNavigationView.getMenu().getItem(3).setChecked(true);
return new Runestablayout();
case R.id.buffs:
bottomNavigationView.getMenu().getItem(4).setChecked(true);
return new Bufftablayout();
}
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Herotablayout();
}
private void loadFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
}
幫幫我...如果可以的話,您可以用答案編輯我的代碼嗎,我是編程新手,謝謝
我將5個片段放置在帶有底部導航欄的主要活動中,這些片段具有回收站視圖,當我從底部導航欄切換時,先前的片段回收站視圖的滾動位置會自動重置為頂部,並且我想保留先前的滾動位置。
當我單擊碎片回收器視圖項目時,它進入活動狀態;當我從活動窗體中按下該鍵時,先前的碎片回收器視圖滾動位置重置為頂部,我也想保留它。
這是片段代碼
public class Assassin_Fragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
RecyclerView recyclerView;
Ass_Adapter ass_adapter;
FirebaseDatabase database;
DatabaseReference reference;
ProgressBar fpgbar;
public Assassin_Fragment() {
}
public static Assassin_Fragment newInstance(String param1, String param2) {
Assassin_Fragment fragment = new Assassin_Fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_assassin_, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.rcview);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
fpgbar = (ProgressBar) view.findViewById(R.id.fpgbar);
FirebaseRecyclerOptions<Assassin_Models> options = new FirebaseRecyclerOptions.Builder<Assassin_Models>().setQuery(FirebaseDatabase.getInstance().getReference().child("Assassin"), Assassin_Models.class).build();
ass_adapter = new Ass_Adapter(options, getContext());
recyclerView.setAdapter(ass_adapter);
reference = database.getInstance().getReference().child("Assassin");
reference.keepSynced(true);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.getChildrenCount() > 0) {
fpgbar.setVisibility(View.GONE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
return view;
}
@Override
public void onStart() {
super.onStart();
ass_adapter.startListening();
}
@Override
public void onStop() {
super.onStop();
ass_adapter.stopListening();
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.about_us_menu, menu);
MenuItem menuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
searchView.setQueryHint("Search heros...");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
processsearch(s);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
processsearch(s);
return false;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
private void processsearch(String s) {
FirebaseRecyclerOptions<Assassin_Models> options = new FirebaseRecyclerOptions.Builder<Assassin_Models>().setQuery(FirebaseDatabase.getInstance().getReference().child("Assassin").orderByChild("heroname").startAt(s).endAt(s + "\uf8ff"), Assassin_Models.class).build();
ass_adapter = new Ass_Adapter(options, getContext());
ass_adapter.startListening();
recyclerView.setAdapter(ass_adapter);
}
}
這是底部導航代碼
getSupportFragmentManager().beginTransaction().replace(R.id.container, new Herotablayout()).addToBackStack(null).commit();
bottomNavigationView = findViewById(R.id.chipnav);
integerDeque.push(R.id.champs);
loadFragment(new Herotablayout());
bottomNavigationView.setSelectedItemId(R.id.champs);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (integerDeque.contains(id)) {
if (id == R.id.champs) {
if (integerDeque.size() != 1) {
if (flag) {
integerDeque.addFirst(R.id.champs);
flag = false;
}
}
}
integerDeque.remove(id);
}
integerDeque.push(id);
loadFragment(getFragment(item.getItemId()));
return true;
}
});
}
private Fragment getFragment(int itemId) {
switch (itemId) {
case R.id.champs:
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Herotablayout();
case R.id.items:
bottomNavigationView.getMenu().getItem(1).setChecked(true);
return new Itemstablayout();
case R.id.spells:
bottomNavigationView.getMenu().getItem(2).setChecked(true);
return new Spelltsablayout();
case R.id.runes:
bottomNavigationView.getMenu().getItem(3).setChecked(true);
return new Runestablayout();
case R.id.buffs:
bottomNavigationView.getMenu().getItem(4).setChecked(true);
return new Bufftablayout();
}
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Herotablayout();
}
private void loadFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
}
幫幫我...如果可以的話,您可以用答案編輯我的代碼嗎,我是編程新手,謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.