#android #android-fragments
#Android #android-фрагменты
Вопрос:
У меня есть фрагмент, который загружает данные каждый раз, когда вы нажимаете на него, я хочу, чтобы его поведение было таким, чтобы, если я нажал на него один раз и перешел к другому фрагменту, когда я вернусь к нему, он не перезагружал данные и больше не показывал «Счетчик загрузки». Как мне это сделать? Это мой фрагмент кода:
public ConsultantFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);//Make sure you have this line of code.
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
View consultantView = inflater.inflate(R.layout.fragment_consultant, container, false);
//consultantList = new ArrayList<>();
//consultantLisView = (ListView) consultantView.findViewById(R.id.consultant_listview);
swipeRefreshLayout = (SwipeRefreshLayout) consultantView.findViewById(R.id.consultant_list_swipe_refresh);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
swipeRefreshLayout.setRefreshing(false);
retrieveConsultantList();
consultantRecyclerView.setAdapter(consultantRecylerViewAdapter);
}
});
consultantRecyclerView = (RecyclerView) consultantView.findViewById(R.id.consultant_recyclerview);
setUpDialog();
FloatingActionButton createConsultantFab = (FloatingActionButton) consultantView.findViewById(R.id.add_consultant);
createConsultantFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent createConsultantIntent = new Intent(getContext(), CreateConsultantActivity.class);
startActivity(createConsultantIntent);
}
});
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(R.string.consultant_list_title);
retrieveConsultantList();
return consultantView;
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
searchMenuItem = menu.findItem(R.id.action_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
/// searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
consultantRecylerViewAdapter.getFilter().filter(newText);
consultantRecylerViewAdapter.notifyDataSetChanged();
return false;
}
private void setUpConsultantRecyclerView(List<Consultant> consultantList) {
consultantRecylerViewAdapter = new ConsultantRecylerViewAdapter(getContext(), consultantList);
consultantRecyclerView.setAdapter(consultantRecylerViewAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
consultantRecyclerView.setLayoutManager(linearLayoutManager);
consultantRecyclerView.setItemAnimator(new DefaultItemAnimator());
}
public void setUpDialog() {
consultantListLoadingDialog = ProgressDialog.show(getContext(),
"Loading consultant",
"Please wait");
}
private void retrieveConsultantList() {
final StringRequest consultantStringRequest = new StringRequest(Request.Method.GET,
Constants.BASE_URL.concat(Constants.CONSULTANT_KEY_WORD),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//eventList = new ArrayList<>();
JsonDataParser parseJSON = new JsonDataParser();
setUpConsultantRecyclerView(parseJSON.jsonArrayToConsultantList(response));
consultantListLoadingDialog.dismiss();
//consultantListAdapter.addAll();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
VolleyRequestQueue.getInstance(getContext()).addToRequestQueue(consultantStringRequest);
}
}
Комментарии:
1. Сохраните ваши данные в пакете, переопределив onSaveInstanceState(Bundle outState) и извлеките их оттуда. Смотрите это
2. Вы можете сохранить arraylist в
onSaveInstanceState(Bundle outState)
методе или сохранить в базе данных и загружать данные из БД при загрузке фрагмента во второй раз. Также для предотвращения использования.add()
метода перезагрузки фрагмента вместо.replace()
транзакции фрагмента.3. Используете ли вы viewpager для обработки фрагментов?
Ответ №1:
Удалите свой метод, который получает результаты с сервера из onCreateView. onCreateView вызывается все время при замене фрагментов. Вместо этого выполняйте одноразовую работу в onCreate.
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
retrieveConsultantList();
}
Комментарии:
1. Он по-прежнему показывает счетчик, когда я удаляюсь от фрагмента и снова открываю его @rahul
2. Переместить setUpDialog(); в onCreate
3. Это все равно не помогает @rahul
4. Вы удалили retrieveConsultantList() и setUpDialog() из onCreateView? Любой другой метод, который необходим на один раз, должен существовать в onCreate вместо onCreateView