Je construis une application qui récupère des données du web et les présente dans un ListView. Ensuite, lorsque je tape sur le dessus d'un élément, une page Web correspondante s'ouvre. Le problème est lorsque j'appuie sur le bouton de retour - pour revenir à l'application - l'extraction des données recommence et, finalement, actualise le ListView. J'ai une activité principale qui contrôle 3 fragments.Redémarrage de ListView lorsque je reviens d'une intention implicite
Les méthodes OnCreate et OnCreateView de chacun sont collées ci-dessous.
Merci.
Activité principale
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content of the activity to use the activity_main.xml layout file
setContentView(R.layout.activity_main);
myFragStack = new Stack<Fragment>();
mn=MainActivity.this;
this.initialiseTabHost(savedInstanceState);
if (savedInstanceState != null) {
// Define a Tab de acordo com o estado salvo
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
// Inicializa o ViewPager
this.intialiseViewPager();
}
EstatisticasFragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
// Set the content of the activity to use the activity_main.xml layout file
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
esconderTeclado(this.getActivity());
rootView = inflater.inflate(R.layout.fragment_estatisticas, container, false);
loadingIndicator = (ProgressBar) rootView.findViewById(R.id.loading_indicator);
//FragmentActivity activity = (FragmentActivity) rootView.getContext();
// Hide loading indicator because the data has been loaded
hideLoadingIndicator();
return rootView;
}
Resultados Fragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
esconderTeclado(this.getActivity());
rootView = inflater.inflate(R.layout.fragment_resultados, container, false);
// Esconder loading indicator porque os dados foram carregados
View loadingIndicator = rootView.findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
recordListView = (ListView) rootView.findViewById(R.id.listview_record);
mEmptyStateTextView = (TextView) rootView.findViewById(R.id.empty_view);
recordListView.setEmptyView(mEmptyStateTextView);
// Create a new adapter that takes an empty list of records as input
mAdapter = new ResultadosRecordAdapter(getActivity(), new ArrayList<Record>());
setRetainInstance(true);
// Set the adapter on the {@link ListView}
// so the list can be populated in the user interface
recordListView.setAdapter(mAdapter);
// define Choice mode for multiple delete
recordListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
recordListView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
mode.getMenuInflater().inflate(R.menu.menu_resultados_contextual, menu);
return true;
}
@Override
public boolean onActionItemClicked(final android.view.ActionMode mode,
MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.selectAll:
//
final int checkedCount = recordsGlobal.size();
// If item is already selected or checked then remove or
// unchecked and again select all
mAdapter.removeSelection();
for (int i = 0; i < checkedCount; i++) {
recordListView.setItemChecked(i, true);
// listviewadapter.toggleSelection(i);
}
// Set the CAB title according to total checked items
// Calls toggleSelection method from ListViewAdapter Class
// Count no. of selected item and print it
mode.setTitle(checkedCount + " Selecionados");
return true;
case R.id.delete:
// Add dialog for confirmation to delete selected item
// record.
AlertDialog.Builder builder = new AlertDialog.Builder(
getContext());
builder.setMessage("Confirmar exclusão do(s) disco(s) selecionado(s)?");
builder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
SparseBooleanArray selected = mAdapter
.getSelectedIds();
for (int i = (selected.size() - 1); i >= 0; i--) {
if (selected.valueAt(i)) {
Record selecteditem = mAdapter
.getItem(selected.keyAt(i));
// Remove selected items following the ids
DeletadosFragment.mDeletadosAdapter.add(selecteditem);
DeletadosFragment.recordsDeletadosGlobal.add(selecteditem);
mAdapter.remove(selecteditem);
recordsGlobal.remove(selecteditem);
Double priceSum = 0.0;
for (int j = 0; j < recordsGlobal.size(); j++){
priceSum += recordsGlobal.get(j).getmPrice();
System.out.println("recordsGlobal.get(j).getmPrice(): " + recordsGlobal.get(j).getmPrice());
}
System.out.println("priceSum: " + priceSum + "\nrecordsGlobal.size(): " + recordsGlobal.size());
Double mediaDouble = EstatisticasFragment.fazerMedia(priceSum, recordsGlobal.size());
String media = mediaDouble.toString();
TextView mediaFinal = (TextView) EstatisticasFragment.rootView.findViewById(R.id.textViewMedia);
mediaFinal.setVisibility(View.VISIBLE);
media = QueryUtils.trimPrice(media);
mediaFinal.setText("R$" + media);
mediaFinal.setTextSize(50);
Activity activity = (Activity) EstatisticasFragment.rootView.getContext();
mediaFinal.setTextColor(ContextCompat.getColor(activity, R.color.colorPrice));
int sumOfRecords = recordsGlobal.size();
Double desvioPadrao = EstatisticasFragment.calcularDesvioPadrao(mediaDouble, ResultadosFragment.recordsGlobal);
Double coeficienteVariacao = EstatisticasFragment.calcularcoeficienteDeVariacaoDosRecords(mediaDouble, desvioPadrao);
TextView totalDeRegistros = (TextView) EstatisticasFragment.rootView.findViewById(R.id.textViewTotalRegistros);
String sumOfRecordsString = Integer.toString(sumOfRecords);
totalDeRegistros.setText("Total de Registros: " + sumOfRecordsString +"\nDesvio Padrão: " + desvioPadrao + "\nC.V: " + coeficienteVariacao);
totalDeRegistros.setTextSize(10);
totalDeRegistros.setTextColor(ContextCompat.getColor(EstatisticasFragment.rootView.getContext(), R.color.colorPrice));
}
}
// Close CAB
mode.finish();
selected.clear();
mAdapter.notifyDataSetChanged();
mAdapter.notifyDataSetInvalidated();
DeletadosFragment.mDeletadosAdapter.notifyDataSetChanged();
DeletadosFragment.mDeletadosAdapter.notifyDataSetInvalidated();
}
});
AlertDialog alert = builder.create();
//alert.setIcon(R.drawable.questionicon);// dialog Icon
alert.setTitle("Confirmation"); // dialog Title
alert.show();
return true;
default:
return false;
}
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode,
int position, long id, boolean checked) {
// TODO Auto-generated method stub
final int checkedCount = recordListView.getCheckedItemCount();
// Set the CAB title according to total checked items
mode.setTitle(checkedCount + " Selecionado(s)");
// Calls toggleSelection method from ListViewAdapter Class
mAdapter.toggleSelection(position);
}
});
recordListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// Achar o record atual que foi clicado
Record currentRecord = mAdapter.getItem(position);
// Converte o URL String em um objeto URI (para passar no construtor de Intent)
Uri recordUri = Uri.parse(currentRecord.getmPermalink());
Intent intent = new Intent(Intent.ACTION_VIEW, recordUri);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
/**recordListView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view,
ContextMenu.ContextMenuInfo contextMenuInfo) {
contextMenu.add(Menu.NONE, 1, Menu.NONE, "Deletar Registro");
}
}
);**/
setHasOptionsMenu(true);
return rootView;
}
DeletadosFragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
esconderTeclado(getActivity());
View rootView = inflater.inflate(R.layout.fragment_deletados, container, false);
// Hide loading indicator because the data has been loaded
View loadingIndicator = rootView.findViewById(R.id.loading_indicator_deletados);
loadingIndicator.setVisibility(View.GONE);
final ListView recordsDeletadosListView = (ListView) rootView.findViewById(R.id.listview_record_deletados);
/**
* TextView that is displayed when the list is empty
*/
TextView mEmptyStateTextView = (TextView) rootView.findViewById(R.id.empty_view_deletados);
recordsDeletadosListView.setEmptyView(mEmptyStateTextView);
// Create a new adapter that takes an empty list of records as input
mDeletadosAdapter = new DeletadosRecordAdapter(getActivity(), new ArrayList<Record>());
// Set the adapter on the {@link ListView}
// so the list can be populated in the user interface
recordsDeletadosListView.setAdapter(mDeletadosAdapter);
// define Choice mode for multiple delete
recordsDeletadosListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
recordsDeletadosListView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
mode.getMenuInflater().inflate(R.menu.menu_deletados_contextual, menu);
return true;
}
@Override
public boolean onActionItemClicked(final android.view.ActionMode mode,
MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.selectAll:
//
final int checkedCount = recordsDeletadosGlobal.size();
// If item is already selected or checked then remove or
// unchecked and again select all
mDeletadosAdapter.removeSelection();
for (int i = 0; i < checkedCount; i++) {
recordsDeletadosListView.setItemChecked(i, true);
// listviewadapter.toggleSelection(i);
}
// Set the CAB title according to total checked items
// Calls toggleSelection method from ListViewAdapter Class
// Count no. of selected item and print it
mode.setTitle(checkedCount + " Selecionados");
return true;
case R.id.reverter:
// Add dialog for confirmation to delete selected item
// record.
AlertDialog.Builder builder = new AlertDialog.Builder(
getContext());
builder.setMessage("Confirmar reciclagem do(s) disco(s) selecionado(s)?");
builder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SparseBooleanArray selected = mDeletadosAdapter
.getSelectedIds();
for (int i = (selected.size() - 1); i >= 0; i--) {
if (selected.valueAt(i)) {
Record selecteditem = mDeletadosAdapter
.getItem(selected.keyAt(i));
// Remove selected items following the ids
mDeletadosAdapter.remove(selecteditem);
recordsDeletadosGlobal.remove(selecteditem);
ResultadosFragment.mAdapter.add(selecteditem);
ResultadosFragment.recordsGlobal.add(selecteditem);
Double priceSum = 0.0;
for (int j = 0; j < ResultadosFragment.recordsGlobal.size(); j++){
priceSum += ResultadosFragment.recordsGlobal.get(j).getmPrice();
System.out.println("recordsGlobal.get(j).getmPrice(): " + ResultadosFragment.recordsGlobal.get(j).getmPrice());
}
System.out.println("priceSum: " + priceSum + "\nrecordsGlobal.size(): " + ResultadosFragment.recordsGlobal.size());
Double mediaDouble = EstatisticasFragment.fazerMedia(priceSum, ResultadosFragment.recordsGlobal.size());
String media = mediaDouble.toString();
TextView mediaFinal = (TextView) EstatisticasFragment.rootView.findViewById(R.id.textViewMedia);
mediaFinal.setVisibility(View.VISIBLE);
media = QueryUtils.trimPrice(media);
mediaFinal.setText("R$" + media);
mediaFinal.setTextSize(50);
Activity activity = (Activity) EstatisticasFragment.rootView.getContext();
mediaFinal.setTextColor(ContextCompat.getColor(activity, R.color.colorPrice));
int sumOfRecords = ResultadosFragment.recordsGlobal.size();
Double desvioPadrao = EstatisticasFragment.calcularDesvioPadrao(mediaDouble, ResultadosFragment.recordsGlobal);
Double coeficienteVariacao = EstatisticasFragment.calcularcoeficienteDeVariacaoDosRecords(mediaDouble, desvioPadrao);
TextView totalDeRegistros = (TextView) EstatisticasFragment.rootView.findViewById(R.id.textViewTotalRegistros);
String sumOfRecordsString = Integer.toString(sumOfRecords);
totalDeRegistros.setText("Total de Registros: " + sumOfRecordsString +"\nDesvio Padrão: " + desvioPadrao + "\nC.V: " + coeficienteVariacao);
totalDeRegistros.setTextSize(10);
totalDeRegistros.setTextColor(ContextCompat.getColor(EstatisticasFragment.rootView.getContext(), R.color.colorPrice));
}
}
// Close CAB
mode.finish();
selected.clear();
mDeletadosAdapter.notifyDataSetChanged();
mDeletadosAdapter.notifyDataSetInvalidated();
ResultadosFragment.mAdapter.notifyDataSetChanged();
ResultadosFragment.mAdapter.notifyDataSetInvalidated();
}
});
AlertDialog alert = builder.create();
alert.setTitle("Confirmation"); // dialog Title
alert.show();
return true;
default:
return false;
}
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode,
int position, long id, boolean checked) {
// TODO Auto-generated method stub
final int checkedCount = recordsDeletadosListView.getCheckedItemCount();
// Set the CAB title according to total checked items
mode.setTitle(checkedCount + " Selecionado(s)");
// Calls toggleSelection method from ListViewAdapter Class
mDeletadosAdapter.toggleSelection(position);
}
});
recordsDeletadosListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// Achar o record atual que foi clicado
Record currentRecord = mDeletadosAdapter.getItem(position);
// Converte o URL String em um objeto URI (para passar no construtor de Intent)
Uri recordUri = Uri.parse(currentRecord.getmPermalink());
Intent intent = new Intent(Intent.ACTION_VIEW, recordUri);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
setHasOptionsMenu(true);
return rootView;
}
--------------------------------------- --EDITED -----------------------------------------
Quoi Je l'ai fait était de créer un drapeau (intentAberto) qui est défini sur true pour me dire que l'intention avait déjà commencé. Puis, sur ma classe Loader, j'ai inséré une condition sur la méthode onStartLoading().
@Override
protected void onStartLoading() {
if (!ResultadosFragment.intentAberto)
forceLoad();
}
qui ont empêché forceload() pour commencer quand j'appuie sur le bouton de retour.
C'est tout!
Merci à Prashanth Kondedath pour votre réponse. Cela m'a fait réfléchir et trouver la solution!