Как сохранить состояние фрагмента во фрагменте, который запустил другой фрагмент? Когда пользователь нажимает кнопку назад, я хочу показать предыдущий фрагмент в его состоянии - PullRequest
0 голосов
/ 21 октября 2019

У меня есть одно приложение Activity, это должно было быть сделано из-за DrawerLayout и глобального NavBar. У меня есть несколько фрагментов, которые я использую. Вот моя проблема:

У меня есть Фрагмент A с RecyclerView, который извлекает новости с сервера, и Фрагмент B , который используется для отображения отдельных новостей.

Фрагмент A имеет RecyclerView с бесконечной прокруткой. Я получаю следующую страницу данных с сервера после прокрутки. Когда я, например, на третьей странице и нажимаю на определенные новости, начинается Фрагмент B . Когда я нажимаю обратно с Фрагмент B , Фрагмент A запускается снова, но загружает первую страницу и снова выполняет всю работу.

Есть ли способ сохранить состояние Фрагмент A и просто открыть Фрагмент B поверх него, чтобы при нажатии на B просто закрывается и A отображается снова.

Вот код:

AllNewsFragment.java

public class AllNewsFragment extends Fragment {
    List<News> newsList = new ArrayList<>();
    RecyclerView allNewsRecycler;
    ProgressBar progressBar;
    NewsRecyclerViewAdapter newsRecyclerViewAdapter;
    public NewsByCityDelegate delegate;
    public int pageNum = 1;
    boolean isLoading = false;
    int totalPage;
    boolean isLastPage = false;
    int tip;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.fragment_all_news, container, false);
        delegate.setUpFragment(ScreenTypeEnum.ALL_NEWS);
        delegate.setSubGroupTag(tip == 1 ? 2 : 1 );
        allNewsRecycler = viewGroup.findViewById(R.id.allNewsRecyclerView);
        progressBar = viewGroup.findViewById(R.id.progressBar);
        Bundle bundle = this.getArguments();
        this.tip = bundle.getInt("FRAGMENT_TYPE"); // tip 1: AllNews, tip 2: RecommendedNews
        TextView gradLabel = delegate.getGradLabel();
        gradLabel.setText(tip == 1 ? "Vijesti" : "Izdvojene vijesti");
        allNewsRecycler.setHasFixedSize(true);
        loadAllNews(1);
        gradLabel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                delegate.getNestedScrollView().smoothScrollTo(0,-1);
            }
        });
        return viewGroup;
    }

    public void loadAllNews(int pageNum) {
        isLastPage = false;
        Retrofit retrofit = RetrofitClientInstance.getRetrofitInstance();
        final GetDataService getDataService = retrofit.create(GetDataService.class);
        Call<AllNews> call = (tip == 1 ? getDataService.getAllNews(pageNum, 1) : getDataService.getRecommendedNews());
        call.enqueue(new Callback<AllNews>() {
            @Override
            public void onResponse(Call<AllNews> call, Response<AllNews> response) {
                final PagedNews pagedNews = response.body().getNews();
                newsList = pagedNews.getData();
                totalPage = pagedNews.getLast_page();
                initRecycler();
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onFailure(Call<AllNews> call, Throwable t) {
                System.out.println("NE PROLAZI CALL " + t.toString());
            }
        });
    }

    void initRecycler() {
        newsRecyclerViewAdapter = new NewsRecyclerViewAdapter(getContext(), newsList, delegate);
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        allNewsRecycler.setLayoutManager(linearLayoutManager);
        allNewsRecycler.setAdapter(newsRecyclerViewAdapter);
        allNewsRecycler.addOnScrollListener(new PaginationScrollListener(linearLayoutManager) {
            @Override
            protected void loadMoreItems() {
                isLoading = true;
                if (!isLastPage) {
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            cacheNextPage();
                        }
                    }, 200);
                }
            }

            @Override
            public boolean isLastPage() {
                return isLastPage;
            }

            @Override
            public boolean isLoading() {
                return isLoading;
            }
        });
    }

    void cacheNextPage() {
        isLoading = false;
        if (pageNum == totalPage) isLastPage = true;
        else pageNum++;
        Retrofit retrofit = RetrofitClientInstance.getRetrofitInstance();
        GetDataService getDataService = retrofit.create(GetDataService.class);
        Call<AllNews> call2 = (tip == 1 ? getDataService.getAllNews(pageNum, 1) : getDataService.getRecommendedNews());
        call2.enqueue(new Callback<AllNews>() {
            @Override
            public void onResponse(Call<AllNews> call, Response<AllNews> response2) {
                PagedNews pagedNews2 = response2.body().getNews();
                newsList.addAll(pagedNews2.getData());
                newsRecyclerViewAdapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<AllNews> call, Throwable t) {
                System.out.println("NE PROLAZI DRUGI PUT: " + t.toString());
            }
        });
    }
}

SingleNewsFragment.java

public class SingleNewsFragment extends Fragment {
    HomeFragmentDelegate delegate;
    News singleNews;
    LinearLayout gradLabelContainer;
    public void setDelegate(HomeFragmentDelegate delegate){
        this.delegate = delegate;
    }

    public void setSelectedNews(News selectedNews) {
        this.singleNews = selectedNews;
    }
    public void setGradLabelContainer(LinearLayout gradLabelContainer){
        this.gradLabelContainer = gradLabelContainer;
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.fragment_single_news,container,false);
        System.out.println("SINGLE NEWS: "+singleNews.getCity());
        delegate.setSingleNewsFragment();
        gradLabelContainer.requestFocus();
        gradLabelContainer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                delegate.backPressed();
            }
        });
        final TextView gradTitle, newsTitle, newsContent, newsDate, gradLabel;
        ImageView gradCover;
        gradLabel = gradLabelContainer.findViewById(R.id.singleNewsGradTextView);
        gradTitle = viewGroup.findViewById(R.id.gradImeTextView);
        gradTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Grad grad = null;
                for(Grad g : delegate.getGradovi()){
                    if(g.getName().equalsIgnoreCase(gradTitle.getText().toString()))
                    {
                        grad = g;
                    }
                }
                Bundle bundle = new Bundle();
                bundle.putInt("CITY_ID", Integer.parseInt(grad.getId()));
                bundle.putString("CITY_NAME", grad.getName());
                bundle.putString("CITY_COVER", grad.getCover_photo());
                bundle.putString("CITY_URL_VALUE", grad.getCity_page_link());
                bundle.putString("CITY_COLOR",grad.getColor());
                delegate.cityPressed(bundle);
            }
        });
        newsTitle = viewGroup.findViewById(R.id.singleNewsTitleTV);
        newsContent = viewGroup.findViewById(R.id.singleNewsContentTV);
        newsDate = viewGroup.findViewById(R.id.singleNewsDateTV);
        gradCover = viewGroup.findViewById(R.id.singleNewsGradImageView);
        //treba iskoristiti Glide
        System.out.println("SINGLE NEWS: "+singleNews.getCity()+", "+singleNews.getTitle()+", "+singleNews.getCover_photo());
        Glide.with(getContext()).load("http://localinfo.proserver.me/"+singleNews.getCover_photo()).into(gradCover);
        System.out.println("SINGLE NEWS: "+singleNews.getCity()+", "+singleNews.getTitle());
        gradLabel.setText(singleNews.getCity());
        gradTitle.setText(singleNews.getCity());
        newsTitle.setText(singleNews.getTitle());
        final String OLD_FORMAT = "yyyy-MM-dd";
        final String NEW_FORMAT = "dd. MM. yyyy. ";

        String newsDate1 = singleNews.getDate().substring(0,11);
        String newsDateFormatted;
        SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT);
        Date d1 = null;
        try {
            d1 = sdf.parse(newsDate1);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        sdf.applyPattern(NEW_FORMAT);
        newsDateFormatted = sdf.format(d1);
        newsDate.setText(newsDateFormatted);
        newsContent.setText(singleNews.getText());
        GradientDrawable background = (GradientDrawable) gradTitle.getBackground();
        String colorValue = singleNews.getCity_color();
        background.setColor(Color.parseColor(colorValue));
        return viewGroup;
    }
}

И вот что onClick на RecyclerItem делает:

singleNewsFragment = new SingleNewsFragment();
        singleNewsFragment.setDelegate(this);
        singleNewsFragment.setGradLabelContainer(singleNewsGradLabelContainer);
        singleNewsFragment.setSelectedNews(newsSelected);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragmentContainer,singleNewsFragment)
                .addToBackStack(null)
                .commit();

Адаптер recycler довольно прост, но при необходимости я могу загрузить этот код тоже.

Iпопытался использовать вместо замены и показать / скрыть фрагментную логику, но она не работала так, как я планировал, или, может быть, я недостаточно осведомлен, чтобы заставить ее работать.

Есть ли кто-нибудь, кто может мне помочь в решении этой проблемы? проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...