У меня есть одно приложение 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попытался использовать вместо замены и показать / скрыть фрагментную логику, но она не работала так, как я планировал, или, может быть, я недостаточно осведомлен, чтобы заставить ее работать.
Есть ли кто-нибудь, кто может мне помочь в решении этой проблемы? проблема?