Array neusortiert danach ListView keine Funktion

  • 9 Antworten
  • Letztes Antwortdatum
1

123thomas

Fortgeschrittenes Mitglied
44
Hallo Leute,

ich habe ein Problem bei dem ich nicht weiterkomme. Das Problem hängt aber nicht an dem Listview sondern an einer Methode die ich geschrieben habe um meine Einträge danach sortiert werden ob die Einträge im ListView durchgestrichen sind oder nicht.

LogCat
01-17 16:07:48.262 22716-22716/? D/dalvikvm: Late-enabling CheckJNI 01-17 16:07:48.642 22716-22716/com.example.einkaufszettel I/dalvikvm: Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted 01-17 16:07:48.642 22716-22716/com.example.einkaufszettel W/dalvikvm: VFY: unable to resolve virtual method 11370: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V 01-17 16:07:48.642 22716-22716/com.example.einkaufszettel D/dalvikvm: VFY: replacing opcode 0x6f at 0x0000 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel I/dalvikvm: Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel W/dalvikvm: VFY: unable to resolve virtual method 11376: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel D/dalvikvm: VFY: replacing opcode 0x6f at 0x0000 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel I/dalvikvm: Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel W/dalvikvm: VFY: unable to resolve virtual method 9063: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V 01-17 16:07:48.647 22716-22716/com.example.einkaufszettel D/dalvikvm: VFY: replacing opcode 0x6e at 0x000e 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel W/dalvikvm: VFY: unable to resolve virtual method 381: Landroid/content/res/TypedArray;.getChangingConfigurations ()I 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel W/dalvikvm: VFY: unable to resolve virtual method 403: Landroid/content/res/TypedArray;.getType (I)I 01-17 16:07:48.657 22716-22716/com.example.einkaufszettel D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 01-17 16:07:48.722 22716-22716/com.example.einkaufszettel D/dalvikvm: GC_FOR_ALLOC freed 165K, 12% free 9721K/11000K, paused 21ms, total 21ms 01-17 16:07:48.722 22716-22716/com.example.einkaufszettel I/dalvikvm-heap: Grow heap (frag case) to 11.650MB for 1127536-byte allocation 01-17 16:07:48.737 22716-22725/com.example.einkaufszettel D/dalvikvm: GC_FOR_ALLOC freed <1K, 11% free 10822K/12104K, paused 14ms, total 14ms 01-17 16:07:48.752 22716-22716/com.example.einkaufszettel D/AbsListView: Get MotionRecognitionManager 01-17 16:07:48.767 22716-22716/com.example.einkaufszettel D/ProgressBar: setProgress = 0 01-17 16:07:48.767 22716-22716/com.example.einkaufszettel D/ProgressBar: setProgress = 0, fromUser = false 01-17 16:07:48.767 22716-22716/com.example.einkaufszettel D/ProgressBar: mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000 01-17 16:07:48.797 22716-22716/com.example.einkaufszettel D/VerwalEintraege listner: com.example.einkaufszettel.MainActivity@4261cc40 01-17 16:07:48.802 22716-22716/com.example.einkaufszettel D/VerwalEintraege listner: com.example.einkaufszettel.MainActivity$4@4261dd28 01-17 16:07:48.802 22716-22716/com.example.einkaufszettel D/Status: Rot, 0 Einträge 01-17 16:07:48.807 22716-22785/com.example.einkaufszettel D/Beende: pDialog 01-17 16:07:48.807 22716-22716/com.example.einkaufszettel I/Activity_Status: Application ist gestartet 01-17 16:07:48.812 22716-22716/com.example.einkaufszettel D/LadeEinträge: 0 Ddb Bcc false 01-17 16:07:48.812 22716-22716/com.example.einkaufszettel D/LadeEinträge: 1 Djybccv Vccx false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 2 Xyb Bcc false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 3 Ghf Vxb false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 4 Hghjdsh Gc false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 5 Ybxbffh Vcc false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 6 Dnsvgvvvc Cxvn false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 7 Dsb Cfd false 01-17 16:07:48.817 22716-22716/com.example.einkaufszettel D/LadeEinträge: 8 Xxb Bvc false 01-17 16:07:48.822 22716-22716/com.example.einkaufszettel D/LadeEinträge: 9 Sbb Gfsg false 01-17 16:07:48.822 22716-22716/com.example.einkaufszettel D/LadeEinträge: 10 Djdcc Hhhhhhhh false 01-17 16:07:48.822 22716-22716/com.example.einkaufszettel D/LadeEinträge: 11 Zgfv Vcc false 01-17 16:07:48.822 22716-22716/com.example.einkaufszettel D/LadeEinträge: 12 Xyb Ccx false 01-17 16:07:48.827 22716-22716/com.example.einkaufszettel D/LadeEinträge: 13 Xyb Vcx true 01-17 16:07:48.827 22716-22716/com.example.einkaufszettel D/LadeEinträge: 14 dsbvc xxxbnmcxj true 01-17 16:07:48.827 22716-22716/com.example.einkaufszettel D/LadeEinträge: 15 Xdb Vd true 01-17 16:07:48.832 22716-22716/com.example.einkaufszettel D/AbsListView: onVisibilityChanged() is called, visibility : 4 01-17 16:07:48.832 22716-22716/com.example.einkaufszettel D/AbsListView: unregisterIRListener() is called 01-17 16:07:48.837 22716-22716/com.example.einkaufszettel D/AbsListView: onVisibilityChanged() is called, visibility : 0 01-17 16:07:48.837 22716-22716/com.example.einkaufszettel D/AbsListView: unregisterIRListener() is called 01-17 16:07:48.897 22716-22716/com.example.einkaufszettel D/libEGL: loaded /system/lib/egl/libEGL_mali.so 01-17 16:07:48.897 22716-22716/com.example.einkaufszettel D/libEGL: loaded /system/lib/egl/libGLESv1_CM_mali.so 01-17 16:07:48.902 22716-22716/com.example.einkaufszettel D/libEGL: loaded /system/lib/egl/libGLESv2_mali.so 01-17 16:07:48.937 22716-22716/com.example.einkaufszettel D/OpenGLRenderer: Enabling debug mode 0 01-17 16:07:48.937 22716-22716/com.example.einkaufszettel D/ProgressBar: updateDrawableBounds: left = 0 01-17 16:07:48.937 22716-22716/com.example.einkaufszettel D/ProgressBar: updateDrawableBounds: top = 0 01-17 16:07:48.937 22716-22716/com.example.einkaufszettel D/ProgressBar: updateDrawableBounds: right = 96 01-17 16:07:48.937 22716-22716/com.example.einkaufszettel D/ProgressBar: updateDrawableBounds: bottom = 96 01-17 16:07:48.957 22716-22716/com.example.einkaufszettel D/AndroidRuntime: Shutting down VM 01-17 16:07:48.957 22716-22716/com.example.einkaufszettel W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41bda700) 01-17 16:07:48.962 22716-22716/com.example.einkaufszettel E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.example.einkaufszettel.MyBaseAdapter.getView(MyBaseAdapter.java:77) at android.widget.AbsListView.obtainView(AbsListView.java:2608) at android.widget.ListView.measureHeightOfChildren(ListView.java:1259) at android.widget.ListView.onMeasure(ListView.java:1171) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052) at android.widget.LinearLayout.onMeasure(LinearLayout.java:590) at android.view.View.measure(View.java:16831) at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586) at android.view.View.measure(View.java:16831) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791) at android.view.Choreographer.doCallbacks(Choreographer.java:591) at android.view.Choreographer.doFrame(Choreographer.java:561) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:5419) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) at dalvik.system.NativeStart.main(Native Method) 01-17 16:07:50.307 22716-22786/com.example.einkaufszettel D/appfreigabe: true

Wenn ich die Variable "aktiviereSortieren" aktiviere Stürzt die Abb ab. Dabei sollte die Methode doch "nur" umsortieren.

Code:
public void sortiereEinträgenachStrike()
    {
        if(aktiviereSortieren) {
            Eintrag[] vorher = this.listEinträge;
            int positionenEinträge = this.getCount();
            Eintrag[] nacher = new Eintrag[100];
            int positionenaktuell = 0;

            if (positionenEinträge > 1) {

                //zuerst die ohne Strike
                for (int i = 0; i < positionenEinträge; i++) {
                    //Wenn Eintrag kein Strike enthält dann einfügen
                    if (!vorher[i].getStrike()) {
                        nacher[positionenaktuell] = vorher[i];
                        positionenaktuell++;
                    }
                }
               
                //dann mit Strike
                for (int i = 0; i < positionenEinträge; i++) {
                    //Wenn Eintrag Strike enthält dann einfügen
                    if (vorher[i].getStrike()) {
                        nacher[positionenaktuell] = vorher[i];
                        positionenaktuell++;
                    }
                }
               
                if (positionenaktuell == -1) {
                    nacher = vorher;
                }

                Variablen.listCount = positionenaktuell;
                this.listEinträge = nacher;
            }
        }
    }
Hat eventuell jemand ein Tipp für mich?

Mit freundlichen Grüßen
Thomas
 
Du bekommst eine NullPointer-Exception. Irgendein Objekt scheint bei dir nicht initialisiert zu sein.

Was steht denn bei deiner Klasse MyBaseAdapter in Zeile 77?
 
Ja danke für deine Antwort. Meiner Meinung nach habe ich alle Objekte initialisiert.

MyBaseAdapter in Zeile 77

Code:
  //Setze Eigenschaften in den Eintrag
        line1.setText(listEinträge[position].getGegenstand());
        line2.setText(listEinträge[position].getAnzahl());
        check.setChecked(listEinträge[position].getStrike());

Ich konnte aber herausfinden das es an dem Code listEinträge[position].getGegenstand() liegt. Und dort steigt er nur aus wenn ich die Methode sortieren aktiviert habe.

Hier das komplette getView aus dem MyBaseAdapter für das ListView

Code:
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
       
        //Hole das Layout von einem Eintrag
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = (View) inflater.inflate(R.layout.listview_two_lines, null);
        } else {
            convertView = (View) convertView;
        }
        //finde die Bestandteile eines Eintrages
        TextView line1 = (TextView) convertView.findViewById(R.id.line_a);
        TextView line2 = (TextView) convertView.findViewById(R.id.line_b);
        final CheckBox check = (CheckBox) convertView.findViewById(R.id.check);
        //Log.d("Position:", position+"");
        //Setze Eigenschaften in den Eintrag
        line1.setText(listEinträge[position].getGegenstand());
        line2.setText(listEinträge[position].getAnzahl());
        check.setChecked(listEinträge[position].getStrike());
        //Wenn die Checkbox im Eintrag aktiviert oder deaktiviert wird dann event auslösen damit die Main Acktivity drauf reagieren kann
        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onCheckedChange(position, check.isChecked());
                }
            }
        });
        //Strike
        if (listEinträge[position].getStrike() == true) {
            //Log.d("Langer Click", "Eintrag: " + (position) + " wird durchgestrichen");
            //Item durchstreichen
            line1.setPaintFlags(line1.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            line2.setPaintFlags(line2.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        } else {
            //Log.d("Langer Click", "Eintrag: " + (position) + " wird nicht mehr durchgestrichen");
            //Item nicht mehr durchstreichen
            line1.setPaintFlags(line1.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
            line2.setPaintFlags(line2.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
            convertView.setBackgroundResource(R.drawable.listgrad);
        }
        return convertView;
    }
 
Dann scheint dein Array Null zu sein, bzw prüf ob 'listEinträge' gefüllt ist. Und prüfe ob der Eintrag vorhanden ist, den du versuchst heraus zu holen.

Ich sehe nicht wo du listEinträge initialisierst.
 
Falls du dich je wundern solltest, wieso es ab 100 Einträge nicht mehr funktioniert, dann solltest du dir die Initialisierung von "nacher" (sic! - eigentlich nachher) mal genauer anschauen.


EDIT: Ein eigener Comparer wäre mEn ein etwas eleganterer Lösungsansatz: Android sort arraylist by properties
 
Zuletzt bearbeitet:
Wenn ich die Fehlermeldung richtig deute liegt der Fehler nicht im Array. Hast Du schon mal überprüft, ob die beiden Views line1 und line2 ungleich null sind.

Die App stürzt ab, als du zum ersten mal die Views aufrufst.
 
Zuletzt bearbeitet:
Also, mal alles zusammen fassen:

Du hast eine Listview mit X Einträgen. Die können durchgestrichen sein. Solange deine 'sortiereEinträgenachStrike' Methode aus ist, funkioniert die App.
Erst nach der Sortierung gibt's eine NPE und die App stürzt ab.

Der Fehler muss also, wie Du richtig erkannt hast in deiner Sortierung liegen.

Ich vermute nun, dass das hier das Problem ist.
Code:
Eintrag[] nacher = new Eintrag[100];

Hiermit erzeugst Du ein Eintragarray mit 100x null. Also [null,null,null,null,....] und in deinen Schleifen mappst Du zuerst alle normalen Einträge und danach halt die durchgestrichenen in das nacher Array.

Wenn nun aber dein listEinträge z.B. nur 10 Einträge hat und dein nacher hat 100, dann hast Du jetzt sowas: [Eintrag1, Eintrag2, ..., Eintrag10, null,null,null, ...]

Und wenn Du nun später auf dein (neues) listEinträge zugreifst ohne auf null zu prüfen, dann stürzt die App ab.


Also (sofern ich überhaupt richtig liege) sehe ich zwei Möglichkeiten:
Code:
Eintrag[] nacher = new Eintrag[this.listEinträge.length];
Somit ist dein neues Array genauso groß wie dein altes ohne überflüssige null Werte.

Oder: Du baust an passender Stelle, bevor Du auf listEinträge zugreifst einen null-Check ein.
Code:
if(!listEinträge.isEmpty() && listEinträge[position] != null) {
    line1.setText(listEinträge[position].getGegenstand());
    line2.setText(listEinträge[position].getAnzahl());
    check.setChecked(listEinträge[position].getStrike());
}


Vermutlich solltest Du sowieso beides machen, einmal um die Arraygröße klein zu halten und zur Sicherheit auf null prüfen.
Noch besser wäre wohl eine anderer Ansatz, wie ihn Thyrion bereits vorgeschlagen hat.
 
Nachtrag:

Der Fehler:
Code:
java.lang.NullPointerException at com.example.einkaufszettel.MyBaseAdapter.getView(MyBaseAdapter.java:77) 
at android.widget.AbsListView.obtainView(AbsListView.java:2608)

Du hast eine Fehlermeldung beim Zugriff auf einen View (getView). Entweder ist der Adapter oder der View null. Ein Fehler im Array würde anders aussehen.
 
Mein Vorschlag:

Code:
public void sortiereEinträgenachStrike()
{  
        if (aktiviereSortieren&&this.listEinträge.length>1)
        {
            ArrayList<Eintrag> sorted= new ArrayList<>();
            for (Eintrag e: this.listEinträge)
                if (!e.getStrike())
                    sorted.add(e);
         
            for (Eintrag e: this.listEinträge)
                if (e.getStrike())
                    sorted.add(e);
         
            this.listEinträge=sorted.toArray(this.listEinträge);
        }
}
 
  • Danke
Reaktionen: 123thomas
Hallo Leute,

sorry für die späte Rückmeldung.

ich konnte nun das Problem beheben mit eurer Hilfe. Ich habe alle Lösungen ausprobiert.
Als erste Info das Problem trat zwar im getView auf, aber auch nur weil dort die listEinträge nicht korrekt war. Die listEinträge wurde in der Methode sortiereEinträgenachStrike "verunstaltet".

Warum meine Lösung nicht funktionierte kann ich leider nicht sagen. Ich habe alle Tips von euch befolgt. Als Beispiel, wenn ich im getView auf null abfrage dann ist meine Liste komplett leer (warum auch immer).

Ich habe nun die Lösung von Jaiel für mich angepasst und die läuft.

Wenn die App gut und stabil läuft dann werde ich diese ummünzen auf eine ArrayList.

Danke an alle die geholfen haben.
 
Zurück
Oben Unten