[英]How can I retain recyclerview scroll position when i back pressed from activity to fragment and when switching fragments in bottom nav bar
I placed 5 fragments in main activity with bottom navigation bar and those fragments have recycler views, when I switch from bottom navigation bar previous fragment recycler view scroll position is automatically reset to top and I want to retain previous scroll position.我将5个片段放置在带有底部导航栏的主要活动中,这些片段具有回收站视图,当我从底部导航栏切换时,先前的片段回收站视图的滚动位置会自动重置为顶部,并且我想保留先前的滚动位置。
When I click on fragments recycler view items it went to activity and when I back pressed form that activity previous fragment recycler view scroll position is reset to top, I want to retain it too.当我单击碎片回收器视图项目时,它进入活动状态;当我从活动窗体中按下该键时,先前的碎片回收器视图滚动位置重置为顶部,我也想保留它。
Here is Fragments code这是片段代码
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);
}
}
Here is bottom nav code这是底部导航代码
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();
}
Help me ... Can you edit my code with answer if possible , I am new to programming, Thanks帮帮我...如果可以的话,您可以用答案编辑我的代码吗,我是编程新手,谢谢
I placed 5 fragments in main activity with bottom navigation bar and those fragments have recycler views, when I switch from bottom navigation bar previous fragment recycler view scroll position is automatically reset to top and I want to retain previous scroll position.我将5个片段放置在带有底部导航栏的主要活动中,这些片段具有回收站视图,当我从底部导航栏切换时,先前的片段回收站视图的滚动位置会自动重置为顶部,并且我想保留先前的滚动位置。
When I click on fragments recycler view items it went to activity and when I back pressed form that activity previous fragment recycler view scroll position is reset to top, I want to retain it too.当我单击碎片回收器视图项目时,它进入活动状态;当我从活动窗体中按下该键时,先前的碎片回收器视图滚动位置重置为顶部,我也想保留它。
Here is Fragments code这是片段代码
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);
}
}
Here is bottom nav code这是底部导航代码
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();
}
Help me ... Can you edit my code with answer if possible , I am new to programming, Thanks帮帮我...如果可以的话,您可以用答案编辑我的代码吗,我是编程新手,谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.