繁体   English   中英

当我从活动中向后按下时,以及在底部导航栏中切换片段时,如何保留recyclerview滚动位置

[英]How can I retain recyclerview scroll position when i back pressed from activity to fragment and when switching fragments in bottom nav bar

  1. 我将5个片段放置在带有底部导航栏的主要活动中,这些片段具有回收站视图,当我从底部导航栏切换时,先前的片段回收站视图的滚动位置会自动重置为顶部,并且我想保留先前的滚动位置。

  2. 当我单击碎片回收器视图项目时,它进入活动状态;当我从活动窗体中按下该键时,先前的碎片回收器视图滚动位置重置为顶部,我也想保留它。

这是片段代码

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();
}

帮帮我...如果可以的话,您可以用答案编辑我的代码吗,我是编程新手,谢谢

  1. 我将5个片段放置在带有底部导航栏的主要活动中,这些片段具有回收站视图,当我从底部导航栏切换时,先前的片段回收站视图的滚动位置会自动重置为顶部,并且我想保留先前的滚动位置。

  2. 当我单击碎片回收器视图项目时,它进入活动状态;当我从活动窗体中按下该键时,先前的碎片回收器视图滚动位置重置为顶部,我也想保留它。

这是片段代码

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM