ArrayList错误,应用程序崩溃

时间:2017-01-04 22:35:31

标签: java android arraylist indexoutofboundsexception mpandroidchart

我有以下问题。我有两个#aktie-skat-logo { margin-top: 15px; display: block; } 应用程序,其中包含fragment的静态arraylist

错误的发生可以这样描述:

  1. fragments添加到entries FragmentA
  2. 点击按钮,在图表中显示arraylist 片段B
  3. 返回 片段A ,将另一个arraylist添加到entrie - >发生错误,应用程序崩溃
  4. 片段的代码是:

    • 片段A

      arraylist
    • 片段B

      button.setOnClickListener(new View.OnClickListener() {
              public void onClick (View view) {
      
      
      
                  if (editText3.getText().toString().matches("")) {
                      Toast.makeText(getActivity(), "You did not enter a Valid Item ID", Toast.LENGTH_LONG).show();
                      return;
                  }
      
                  else if (editText2.getText().toString().matches("")) {
                      Toast.makeText(getActivity(), "You did not enter a Valid Quantitiy", Toast.LENGTH_LONG).show();
                      return;
      
                  }
      
                  else {
      
                      String nomen = (editText3.getText().toString());
                      float number = Float.parseFloat(editText2.getText().toString());
      
                      entries.add(new PieEntry(number, nomen));
      
                      editText3.setText("");
                      editText2.setText("");
                      editText3.requestFocus();
                  }
              }
          });
      

    错误即时消息:

    java.lang.ArrayIndexOutOfBoundsException:length = 1;索引= 1

    如果一些经验丰富的专家可以帮助我,我将非常感激。 感谢。

    更新:包含错误堆栈

     button2.setOnClickListener(new View.OnClickListener() {
    public void onClick (View view) {
        getResources().getColor(R.color.violp);
        getResources().getColor(R.color.bluep);
        getResources().getColor(R.color.redp);
        getResources().getColor(R.color.greenp);
        getResources().getColor(R.color.yellowp);
        getResources().getColor(R.color.orangep);
        getResources().getColor(R.color.lightbluep);
        getResources().getColor(R.color.purplep);
        getResources().getColor(R.color.darkredp);
    
        PieDataSet set = new PieDataSet(entries, "");
    
    
        set.setColors(new int[]{R.color.bluep, R.color.greenp, R.color.violp, R.color.redp, R.color.yellowp, R.color.orangep, R.color.lightbluep, R.color.purplep, R.color.darkredp}, getActivity());
        PieData datax = new PieData(set);
        piechart.setData(datax);
    
        Toast.makeText(getActivity(), (R.string.loading),
                Toast.LENGTH_SHORT).show();
    
        piechart.setNoDataText(String.valueOf(R.string.nodata));
        piechart.notifyDataSetChanged();
        piechart.animateX(2000, Easing.EasingOption.EaseInExpo);
        piechart.animateY(2000, Easing.EasingOption.EaseInExpo);
    
    
    
        }
    
    
    
    });
    

1 个答案:

答案 0 :(得分:1)

MPAndroidChart无法保护您免受separating model and view layers的影响以及管理片段和活动lifecycles的问题。请注意,片段之间的“通信”(例如一个片段操纵另一个片段的数据)是not recommended by Google

  

两个片段永远不应该直接沟通

尽管Entry可能看起来像模型层的成员,但它实际上被设计为与PieChart紧密耦合,ArrayIndexOutOfBoundsException是视图层的一部分。它肯定比它与之关联的View更长,如果你想避免诸如List<Entry>之类的错误,那么支持List生命周期应该与它所在的Fragment的生命周期一致。用过的。这并不意味着一旦PieChart成为List<Entry>的一部分,就永远无法从ViewPager添加/删除 - MPAndroidChart将允许您在上述约束内执行此操作。

为了解决上述错误,我建议采用与共享静态对象不同的方法,这在Android中几乎不是一个好主意。相反,您可以共享一个单独的模型层,其中包含您将用于构造ViewPager的数据。当片段A更新模型时,您可以使用事件从片段B内的数据触发重建图表。

您在评论中说明您使用的是fragmentTransaction.show().hide()使用onHiddenChangedViewPager,通常会将碎片保持在恢复状态。也许最简单的解决方案是覆盖onActivityCreated(View v),因为当@Override onActivityCreated(View v) { //get updated model from Activity //rebuild chart from updated model } @Override onHiddenChanged(boolean hidden) { if (hidden == false) { //get updated model from Activity //rebuild chart from updated model } } 切换到新页面时总是会调用它。我认为(不是100%肯定)你还需要在StoredProcedureQuery query = getCurrentSession().createStoredProcedureQuery("updateinselgibilitycount") .registerStoredProcedureParameter("ppatientinsid", Long.class, ParameterMode.IN) .registerStoredProcedureParameter("pencounterID", Long.class, ParameterMode.IN) .setParameter("ppatientinsid", ppatientinsid).setParameter("pencounterID", encounterID); query.execute(); 打电话。

所以,你会有这样的事情:

    10:04:42.167 [http-nio-8080-exec-3] WARN  o.h.p.internal.ProcedureCallImpl - HHH000456: Named parameters are used for a callable statement, but database metadata indicates named parameters are not supported.
Hibernate: 
    {call updateinselgibilitycount(?,?)}
10:04:42.329 [http-nio-8080-exec-3] ERROR c.p.w.utilities.ExceptionHandler - User ID : 1 
Error : org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:413)
    at org.springframework.orm.hibernate5.HibernateExceptionTranslator.translateExceptionIfPossible(HibernateExceptionTranslator.java:54)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)