Problem mit ListView/Array-Adapter // Anfänger benötigt Hilfe bei simplen App-Projekt

  • 4 Antworten
  • Letztes Antwortdatum
M

madbert

Neues Mitglied
0
Hallo Android-Entwickler,

ich habe vor Kurzem begonnen mich ein wenig mit der App-Programmierung zu beschäftigen und hab bei meinem ersten Projekt einige Fragen, bei denen mir die richtigen Suchbegriffe fehlen um danach zu googln. Verzeiht mir, wenn es ein solchen ähnlichen Beitrag schon gibt.

Zuerst kurz ein paar Informationen:
Ich habe keine Vorkenntnisse in Java und habe auch nicht vor diese Programmiersprache intensiv zu lernen. Ich will mein kleines Projekt für eine simple und private App nur verwirklichen. Ich habe jedoch allgemeine Kenntnisse in der Programmierung (z.B. Python, VBS, usw.)

Ich arbeite mit Android Studio 1.3.2 falls diese Information benötigt wird, aber nach meinem Wissen ist es das gleiche wie mit Eclipse. Man hat dort auch seine XML-File und seine Activity-File.


Informationen zu dem Projekt:
Meine App ist eigentlich recht simpel bzw. wüsste ich grob wie ich das in anderen Programmiersprachen verwirklichen könnte. Es sollen vorerst 2 Listen nebeneinander sein. Unterhalb der Listen jeweils ein Eingabefeld und ein Button, sodass in das Eingabefeld Werte eingegeben werden können und diese dann jeweils in der rechten oder linken Liste erscheinen. Letztendlich werde ich in Zukunft dann daran arbeiten mir noch ein weiteres Ausgabefeld zu erstellen, dass die Summe aller Werte in den Arrays (linke oder rechte Liste) ausgibt.

Ich werde jetzt zunächst noch mein derzeitigen Code zeigen, damit ihr euch ein vollständigen Überblick machen könnt und anschließend meine Fragen stellen.

Hier zunächst die XML-File:

Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listleft"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="false"
        android:layout_above="@+id/edittextleft"
        android:layout_alignRight="@+id/edittextleft"
        android:layout_alignEnd="@+id/edittextleft" />
        //android:layout_toLeftOf="@+id/btnleft"
        //android:layout_toStartOf="@+id/btnleft"
        //android:layout_above="@+id/edittextleft" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/edittextleft"
        android:hint="Enter a new item"
        android:layout_above="@+id/btnleft"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add Item"
        android:id="@+id/btnleft"
        android:onClick="AddItemleft"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listright"
        android:layout_alignWithParentIfMissing="false"
        android:layout_alignParentStart="false"
        android:layout_marginLeft="200dp"
        android:layout_marginBottom="100dp"
        android:smoothScrollbar="false" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/edittextright"
        android:layout_alignBottom="@+id/edittextleft"
        android:layout_alignLeft="@+id/listright"
        android:layout_alignStart="@+id/listright"
        android:hint="Enter new price" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add Item"
        android:id="@+id/btnright"
        android:onClick="Additemright"
        android:layout_alignBottom="@+id/btnleft"
        android:layout_alignRight="@+id/edittextright"
        android:layout_alignEnd="@+id/edittextright" />

</RelativeLayout>


Hier die Activity-File:

Code:
public class MainActivity extends AppCompatActivity {

    // Definiere Variablen
    private ArrayList<String> items;
    private ArrayAdapter<String> itemsAdapter;
    private ListView listleft;
    private ArrayList<String> itemsright;
    private ArrayAdapter<String> itemsAdapterright;
    private ListView listright;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Verbindet Variablen mit dem Objekt und verbindet den Adapter
        listleft = (ListView) findViewById(R.id.listleft);
        items = new ArrayList<String>();
        itemsAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, items);
        listleft.setAdapter(itemsAdapter);
        items.add("First Item");
        items.add("Second Item");
        setupListViewListener();


        listright = (ListView) findViewById(R.id.listright);
        itemsright = new ArrayList<String>();
        itemsAdapterright = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, itemsright);
        listright.setAdapter(itemsAdapterright);
        items.add("5,60");
        setupListViewListener();

    }

    // LEFT Attaches a long click listener to the listview
    private void setupListViewListener() {
        listleft.setOnItemLongClickListener(
                new AdapterView.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,
                                                   View item, int pos, long id) {
                        // Remove the item within array at position
                        items.remove(pos);
                        // Refresh the adapter
                        itemsAdapter.notifyDataSetChanged();
                        // Return true consumes the long click event (marks it handled)
                        return true;
                    }

                });

        }


    // RIGHT
    private void setupListViewListenerRight() {
        listleft.setOnItemLongClickListener(
                new AdapterView.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,
                                                   View item, int pos, long id) {
                        // Remove the item within array at position
                        items.remove(pos);
                        // Refresh the adapter
                        itemsAdapter.notifyDataSetChanged();
                        // Return true consumes the long click event (marks it handled)
                        return true;
                    }

                });

    }

    // BTN LEFT Neue Methode für den Button
    public void onAddItem(View v) {
        EditText etNewItem = (EditText) findViewById(R.id.edittextleft);
        String itemText = etNewItem.getText().toString();
        itemsAdapter.add(itemText);
        etNewItem.setText("");
    }

    // BTN RIGHT
    public void Additemright (View v) {
        EditText edittextright = (EditText) findViewById(R.id.edittextright);
        String itemsTextright = edittextright.getText().toString();
        edittextright.setText("");
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }


}


Mir ist bewusst, dass es bestimmt kein schöner Stil ist und es etwas durcheinander ist. Ich habe deswegen versucht euch ein möglichst großen Einblick zu gewährleisten. Vieles von dem Code ist aus fremden Code-Fetzen (Tutorials) zusammengesetzt und für mich angepasst.

Nun zu dem Problem. Zuvor als ich nur eine Liste, 1 Eingabefeld etc. hatte, war es soweit funktionstüchtig. Ich konnte über das Eingabefeld Items zu dem Array bzw. der Liste hinzufügen und entfernen. Jetzt habe ich versucht einfach ein zweites Listview etc. zu erstellen und den Code zu dublizierung, nur dass ich die Namen angepasst habe. Als Beispiel habe ich für die ListView (links) im Code schon 2 Items hinzugefügt (First-, Second Item). Für die rechte ListView hatte ich als Beispiel "5,60" gesetzt.

Wenn ich die App jetzt starte, sind alle 3 Beispiele in der linken ListView. Meiner Meinung müsste der Fehler bei dem falsch bzw. noch nicht angepassten Adapter für die rechte ListView liegen.
Code:
itemsright = new ArrayList<String>();
        itemsAdapterright = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, itemsright);

Ich weiß nur nicht was davon der Name, der anzupassen ist und welcher Teil das Objekt "castet" o.ä. . Außerdem funktioniet seitdem ich alles angepasst und versucht habe zu dublizieren auch nicht mehr das Hinzufügen von Items.

Meine Bitte wäre, dass sich Jemand das einmal durchliest, der davon zumindestens mehr versteht als ich es tue. Ich wäre sehr dankbar!


Ein weiteres Problem, was ich noch nicht gelöst habe, ist das Speichern der Daten nach dem Schließen der App. Ich habe schon grob gegooglt und schon Tutorials gefunden wie das z.B. mit dem SharedPrefereces funktionieren soll. Allerdings durchblicke ich es noch nicht ganz und weiß z.B. nicht, ob der Code dafür in die "OnCreate"-Methode mit reingehört oder ob man das irgendwie gesonder über eine andere Methode macht.


Ich hoffe Jemand führt sich den ganzen Text zu Gemüte und kann mir helfen. Ich würde mich sehr darüber freuen!
 
Ich sehe zum Beispiel dass du "itemsadapterright" gar nicht benutzt in den longclick events. Bei beiden wird nur ein Adapter (der Linke) angesprochen. Auch füllst du nur den linken Adapter mit allen Strings und nicht wie von dir im Text beschrieben den rechten auch.

Code:
items.add("5,60");

itemsright wird gar nicht gefüllt also!

---------------------------------------------------------------------------------------

SharedPreferences sind einfach.

Hier ein SharedPreferences objekt:
Code:
SharedPreferences prefs;

Im onCreate:
Code:
...
prefs=getSharedPreferences("myPrefs",0);
...

2 Methoden in meiner Activity Klasse dazu(Hab dir mal die Zeilen wo ich einen bestimmten boolean aus einem anderen Objekt mittel der preferences setze und lese hingeschrieben)
Code:
    public void loadSharedPrefs()
    {
       ....
        mView.soundOn=prefs.getBoolean("sound", true);
        ....
    }

    public void setSharedPrefs()
    {
        SharedPreferences.Editor editor = prefs.edit();
        ...
        editor.putBoolean("sound", mView.soundOn);
        ...
        editor.commit();
    }

Erklärung:

prefs=getSharedPreferences("myPrefs",0); - "myPrefs" ist mein Key zu bestimmten prefs. Da kann man viele unterschiedliche prefs haben wenn man das braucht.Sagen wir mal es könnte ein "User1pref" und ein "User2pref" geben...Gibt es noch keinen unter diesen key wird er erstellt.Die 0 bedeutet privater Modus...andere Apps können deine Prefs nicht auslesen...

mView.soundOn=prefs.getBoolean("sound", true); - wie der name sagt holst du dir ein boolean dass du unter "sound" gespeichert hast unter der jeweiligen pref...in meinem Fall unter "myPrefs", das zweite Argument sagt was zurückgegeben werden soll wenn noch kein wert unter "sound" gespeichert ist

SharedPreferences.Editor editor = prefs.edit(); - editor um die prefs zu editieren

editor.putBoolean("sound", mView.soundOn); - specihere das boolean unter dem key "sound"

editor.commit(); - ausführen, alternativ kann man auch editor. apply(); benutzen

ganz einfach und straightforward...

lg
 
Zuletzt bearbeitet:
Also schon mal vielen Dank für deine Hilfe!

Mir sind dank deinem Hinweis echt einige Patze aufgefallen und konnte auch einiges beheben. Wenn man nicht alles versteht und durchschaut, sieht man auch mal den Wald vor lauter Bäumen nicht.

Zur Zeit funktionieren meine beiden Listen und ich kann jeweils etwas hinzufügen. Allerdings funktionier der longclicklistener bei dem rechten ListView noch nicht. Ich habe mir überlegt ob man es auch folgendermaßen schreiben könnte:

Code:
   private void setupListViewListener() {
        listleft.setOnItemLongClickListener(
                new AdapterView.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,
                                                   View item, int pos, long id) {
                    
                        items.remove(pos);
                        itemsAdapter.notifyDataSetChanged();
                        return true;
                    }

                });
        listright.setOnItemLongClickListener(); {
            @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,
                                                    View item, int pos, long id) {
                        itemsright.remove((pos);
                        itemsAdapterright.notifyDataSetChanged();
                        return true;
                 }
              });

Da es scheinbar nicht funktioniert, werde ich einige Fehler drin haben oder man kann es so gar nicht schreiben. Ich habe die Vermutung, dass ich für die rechte Liste (listright) eine anderen View für den AdapterView benötige als "?". Verzeiht wenn die Terminologie eventuell falsch ist. Diesen Code habe ich leider einem fremden Beispiel entnommen und durchblicke es noch nicht ganz. Ich würde mich wieder sehr über ein kleinen Hinweis freuen!
 
Code:
listright.setOnItemLongClickListener() ; { ... }

zwischen der Methode setOnItemLongClickListener() und dem Block (geschweifte Klammer) steht ein Semikolon. Einfach entfernen. ;)
 
Der Code weist schon Fehler auf die der Compiler dir auch anzeigen sollte.

Versuche zur Sicherheit das Objekt so aus der ArrayList zu entfernen:

items.remove(adapter.getItemAtPosition(pos));

Das AdapterView<?> ist schon richtig so...

während des Schreibens: Das was markus.tullius meint und noch mehr! So wie das erste geschrieben wurde frage ich mich wieso das 2. mal so daneben gehen konnte...ganz unten muss noch eine geschweifte Klammer hin und zusätzlich zum Semikolon worauf markus.tullius hinwies noch die Klammer gleich hinterher vor dem Semikolon weg und ein "new AdapterView.OnItemLongClickListener() ." einfügen ;)
 
Zurück
Oben Unten