0

У меня есть следующая проблема. У меня есть два приложения fragment со статическим arraylist, который используется как в fragments.Ошибка ArrayList, сбой приложений

вхождение ошибки может быть описана следующим образом:

  1. Добавить entries в arraylist (Fragmenta)
  2. кнопку Хит, дисплей arraylist на графике (Фрагмент B)
  3. Вернуться к Фрагмент, добавить еще entrie к arraylist - происходит> ошибка, приложение падает

Код фрагментов заключается в следующем:

  • фрагмента А

    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(); 
          } 
         } 
        }); 
    
  • Фрагмент B

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

ОШИБКА И. М. ПОЛУЧЕНИЕ ЭТО:

java.lang.ArrayIndexOutOfBoundsException: длина = 1; index = 1

Если бы некоторые опытные эксперты могли мне помочь, я был бы очень благодарен. Спасибо.

UPDATE: ОШИБКА СТЕК ВКЛЮЧЕНО

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.nextpietwo, PID: 2528 
        java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 
         at com.github.mikephil.charting.renderer.PieChartRenderer.drawDataSet(PieChartRenderer.java:244) 
         at com.github.mikephil.charting.renderer.PieChartRenderer.drawData(PieChartRenderer.java:147) 
         at com.github.mikephil.charting.charts.PieChart.onDraw(PieChart.java:126) 
         at android.view.View.draw(View.java:17185) 
         at android.view.View.updateDisplayListIfDirty(View.java:16167) 
         at android.view.View.draw(View.java:16951) 
         at android.view.ViewGroup.drawChild(ViewGroup.java:3727) 
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513) 
         at android.view.View.updateDisplayListIfDirty(View.java:16162) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711) 
         at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691) 
         at android.view.View.updateDisplayListIfDirty(View.java:16130) 
         at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648) 
         at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654) 
         at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762) 
         at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800) 
         at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608) 
         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215) 
         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254) 
         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337) 
         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874) 
         at android.view.Choreographer.doCallbacks(Choreographer.java:686) 
         at android.view.Choreographer.doFrame(Choreographer.java:621) 
         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
+1

Пожалуйста, включите Ошибка стека, как это трудно, чтобы выяснить, какая линия бросает исключение. – user2004685

+0

сделано :) надеюсь, что это поможет –

+0

Что такое 'entries'? Где и как это было определено? – user2004685

ответ

1

MPAndroidChart не может защитить вас от последствий не separating model and view layers и от проблем с управляющим в lifecycles фрагментов и деятельности. Обратите внимание, что «связь» между фрагментами (например, один фрагмент манипулирования данными другого) является not recommended by Google:

Два Фрагменты никогда не должны общаться непосредственно

Хотя Entry может выглядеть как член модели слой, он фактически предназначен для плотной связи с PieChart, который является частью слоя представления. Он определенно должен не пережить вид, с которым он связан, и если вы хотите избежать ошибок, таких как ArrayIndexOutOfBoundsException, жизненный цикл резервного списка должен совпадать с жизненным циклом Фрагмента, в котором он используется. Это не означает, что вы никогда не сможете добавлять/удалять из List<Entry>, если это часть PieChart. MPAndroidChart позволит вам сделать это в рамках вышеуказанных ограничений.

Чтобы исправить вышеуказанную ошибку, я бы предложил другой подход, чем обмен статическим объектом, который почти никогда не является хорошей идеей в Android. Вместо этого вы можете разделить отдельный слой модели, содержащий данные, которые вы будете использовать для построения List<Entry>. Когда Fragment A обновляет модель, вы можете использовать событие, чтобы инициировать восстановление диаграммы из данных внутри фрагмента B.

Вы указали в комментариях, что используете ViewPager. ViewPager использует fragmentTransaction.show() и .hide() и, как правило, сохраняет Фрагменты в возобновленном состоянии. Возможно, самым простым решением является переопределение onHiddenChanged, поскольку это всегда вызывается, когда ViewPager переключается на новую страницу. Я думаю (не уверенно на 100%), что вам также понадобится позвонить в 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 
    } 
} 
+0

Благодарим за быстрый подробный ответ. Я сделаю это ответом на мою проблему. Я использую приложение viewpager, кстати, как это повлияет на возможное решение моей проблемы? –

+0

Я рад, что это помогает - я сейчас обновлю свой ответ, чтобы отразить возможное решение для 'ViewPager' –

Смежные вопросы