簡體   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