我正在构建一个从Web获取数据并将其显示在ListView中的应用。然后,当我点击某些项目的顶部时,将打开一个相应的网页。问题是当我点击"返回"按钮时 - 要返回应用程序 - 数据的获取再次开始,最终会刷新listView。
我有一个控制3个片段的主要活动。下面粘贴了每种方法的弹药和onCreateview方法。
谢谢。
主要活动
@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;
}
RESUCTADOS 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;
}
------------------------------------------------------------------------------------------------------------------------------------------------------
我所做的是创建一个设置为true的标志(Intentaberto(,以告诉我意图已经开始。
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);
intentAberto = true;
startActivity(intent);
}
然后,在我的加载程序类上,我在onstartloading((方法上插入了一个条件。
@Override
protected void onStartLoading() {
if (!ResultadosFragment.intentAberto)
forceLoad();
}
在我按下后按钮时阻止forceload((开始。
就是这样!
谢谢Prashanth Kondedath的回答。它使我思考并找到解决方案!
为什么不覆盖页面加载活动的backPress()
事件,并为您的主要活动提供额外的意图,在该活动中可以传递一些标志(Pageloaded = true
(。在您的主要活动中,请检查此标志,如果其true不会重新加载内容...这是最简单的做方法.....