2017-04-21 38 views
1

我正在构建一个应用程序,它从Web中提取数据并将其呈现在ListView中。然后,当我点击某个项目的顶部时,就会打开相应的网页。问题是当我点击后退按钮 - 回到应用程序 - 数据的获取从头开始,最终刷新ListView。当从隐式意图返回时ListView刷新

我有一个主要活动,控制3片段。下面粘贴每个人的OnCreate和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; 
} 

Resultados片段

@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 -----------------------------------------

什么我所做的是创建一个标志(intentAberto),该标志被设置为true以告诉我该意图已经开始。

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); 

      } 

然后,在我的Loader类上,我在onStartLoading()方法上插入了一个条件。

@Override 
protected void onStartLoading() { 
    if (!ResultadosFragment.intentAberto) 
     forceLoad(); 
} 

当我按下后退按钮时,阻止forceLoad()启动。

就是这样!

谢谢Prashanth Kondedath为您的答案。它让我想到并找到解决方案!

回答

0

你为什么不重写backPress()活动页面加载活动,并把额外的意图你的主要活动,你可以通过一些像(Pageloaded = true)标志。在你的主要活动中检查这个标志,如果它的真实不重新加载内容...这是最简单的方式.....