Mitglieder surfen ohne Werbung: Jetzt kostenlos registrieren!

Listview: Mit Buttonklick neue Zeile, für jede Zeile eigene Layout-Datei

  • 4 Antworten
  • Neuester Beitrag
Diskutiere Listview: Mit Buttonklick neue Zeile, für jede Zeile eigene Layout-Datei im Android App Entwicklung im Bereich Betriebssysteme & Apps.
T

TimWeiland

Neues Mitglied
Hallo ich heiße Tim und programmiere aktuell meine erste App.
Mein Problem: Ich habe ein ListView dem der User per Buttonklick eine neue Zeile hinzufügt mit seinem eigenem Text. Zusätzlich enthält die Zeile dann einen Löschen Imagebutton und eine Checkbox. Ich möchte allerdings, dass der Checkboxstatus gespeichert wird, sodass beim wiederaufrufen der Activity eine bereits abgehakte Checkbox weiterhin abgehakt bleibt. Allerdings braucht dafür meines Wissens jede Checkbox eine eigene Id. Das ist mit einer einzelnen Layout-Datei natürlich schlecht. (Oder irre ich mich da?)
Ich bin zu der Lösung gekommen, dass ich vllt. mit switch case für jede Position eine eigene Layout-Datei hinterlegen kann.
Meine Frage: Wie kann ich das Verwirklichen? Also hätte jemand ein Beispiel, wie man ein ListView bei dem man per Buttonklick eine neue Zeile einfügt schreiben kann, bei dem für jede Zeile eine andere Layout-Datei hinterlegt ist.
Oder hätte jemand eine andere Idee um dies zu verwirklichen?
Freue mich über Ideen, Beispiele und Vorschläge!
 
J

jogimuc

Stammgast
Hallo und Willkommen im Forum.

Zeige uns doch mal deinen jetzigen Code und Layout.

Du hast bestimmt eine sogenannte Custom Listview mit einen eigenen Adapter gemacht.
Genau in dem Adapter musst du auch die Checkbox setzen.

Ich würde eine Liste hinzufügen führen in der gespeichert wird bei welchen listen Eintrag die Box aktiv oder inaktiv ist. Und im Adapter prüfst du und setzt die Box entsprechend.

Wie schon oben gesagt ohne Code wenig Hilfe möglich.
 
Zuletzt bearbeitet:
T

TimWeiland

Neues Mitglied
Erstmal schonmal vielen Dank für die schnelle Hilfe.
Dann poste ich mal meine Codes:

Das sind die relevanten Teile der Java-Datei:

Code:
private void loadTaskList() {

        ArrayList<String> taskList = dbHelper.getTaskList();
        if (mAdapter == null) {
                    mAdapter = new ArrayAdapter<String>(this, layout.row, id.task_title, taskList);
            lstTask.setAdapter(mAdapter);
                    lstTask.getAdapter().getCount();
            Toast.makeText(getApplicationContext(), "Aufgabenanzahl:" + lstTask.getAdapter().getCount(), Toast.LENGTH_LONG).show();
            textView3.setText("" + lstTask.getAdapter().getCount());

            } else {
            mAdapter.clear();
            mAdapter.addAll(taskList);
            mAdapter.notifyDataSetChanged();
        }
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        Drawable icon = menu.getItem(0).getIcon();
        icon.mutate();
        icon.setColorFilter(getResources().getColor(android.R.color.white), PorterDuff.Mode.SRC_IN);

        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
            case  id.action_add_task:
                final EditText taskEditText = new EditText(this);
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Aufgabe hinzufügen");
                builder.setMessage("Was möchtest du als nächstes tun?");
                builder.setView(taskEditText);
                builder.setPositiveButton("Hinzufügen", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                    String task = String.valueOf(taskEditText.getText());
                                    dbHelper.insertNewTask(task);
                                    loadTaskList();
                                lstTask.getAdapter().getCount();
                                textView3.setText("" + lstTask.getAdapter().getCount());
                                Toast.makeText(getApplicationContext(), "Aufgabenanzahl:" + lstTask.getAdapter().getCount(), Toast.LENGTH_LONG).show();
                                }
                             });

                builder.setNegativeButton("Zurück", null);
                AlertDialog dialog = builder
                        .create();
                dialog.show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void deleteTask(View view) {
        View parent = (View) view.getParent();
        TextView taskTextView = (TextView) parent.findViewById(id.task_title);
        Log.e("String1", (String) taskTextView.getText());
        String task = String.valueOf(taskTextView.getText());
        dbHelper.deleteTask(task);
        loadTaskList();
        lstTask.getAdapter().getCount();
        Toast.makeText(getApplicationContext(), "Aufgabenanzahl:" + lstTask.getAdapter().getCount(), Toast.LENGTH_LONG).show();
        textView3.setText("" + lstTask.getAdapter().getCount());
        cCounter--;
        textView7.setText(cCounter);
        if (cCounter < 0) {
            textView7.setText(Integer.toString(0));
        }}
Hier ist das Layout für erzeugte ListView Zeilen:

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/task_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:text="Example"
        android:textSize="20sp" />

    <ImageButton
        android:id="@+id/btnDelete"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="2dp"
        android:layout_marginRight="2dp"
        android:background="#F44336"
        android:onClick="deleteTask"
        android:src="@android:drawable/ic_menu_delete" />

    <CheckBox
        android:id="@+id/check"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="2dp"
        android:layout_marginEnd="36dp"
        android:checked="false"
        android:onClick="onCheckboxClicked" />


</RelativeLayout>
Das ist die Database Helfer-Klasse:

Code:
package com.example.selbstkonzept;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;


public class Dbhelper extends SQLiteOpenHelper {

    private static final String DB_NAME="EDMTDev";
    private static final int DB_VER = 1;
    public static final String DB_TABLE="Task";
    public static final String DB_COLUMN = "TaskName";
    public static final String DB_ANZAHL = "Anzahl";


    public Dbhelper(Context context) {
        super(context, DB_NAME, null, DB_VER);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = String.format("CREATE TABLE %s (ID INTEGER PRIMARY KEY AUTOINCREMENT,%s TEXT NOT NULL);",DB_TABLE,DB_COLUMN,DB_ANZAHL);
        db.execSQL(query);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = String.format("DELETE TABLE IF EXISTS %s",DB_TABLE);
        db.execSQL(query);
        onCreate(db);

    }

    public void insertNewTask(String task){
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DB_COLUMN,task);
        db.insertWithOnConflict(DB_TABLE,null,values,SQLiteDatabase.CONFLICT_REPLACE);
        db.close();
    }

    public void deleteTask(String task){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(DB_TABLE,DB_COLUMN + " = ?",new String[]{task});
        db.close();
    }


    public ArrayList<String> getTaskList() {
        ArrayList<String> taskList = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(DB_TABLE, new String[]{DB_COLUMN}, null, null, null, null, null);
        while (cursor.moveToNext()) {
            int index = cursor.getColumnIndex(DB_COLUMN);
            taskList.add(cursor.getString(index));
        }
        cursor.close();
        db.close();
        return taskList;
    }

    }
 
J

jogimuc

Stammgast
Hallo das ist nicht der Adapter.
Das Menue hat damit nicht's zutun.

Ok du speichert die Eingaben in einer DB, warum speicherst du nicht gleich auch den Zustand der Checkbox mit in der DB?

Etweder machst du eine zweite Liste in der du den Zustand hälst.oder eine eigene Daten Struktur.

im Adapter denn du nicht zeigst kannst du auch die checkbox setzen eine id hast du für checkbox ja musst sie halt im Adapter suchen. Genauso wie du die Textview suchst und setzt.

Für dein vorhaben musst du schon einen Custom ArrayAdapter erstellen.
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Allerdings braucht dafür meines Wissens jede Checkbox eine eigene Id. Das ist mit einer einzelnen Layout-Datei natürlich schlecht. (Oder irre ich mich da?)
Ja da irrst du dich etwas. Da du keinen Custom Adapter also einen Klasse die von ArrayAdapter oder auch BaseAdapter abgeleitet ist hast, wird das auch nicht gehen.

Der Rest mit Layout tauschen.... ist sinnlos und wird nie zum Erfolg führen.


In dem Adapter oder der Klasse hättest du eine du eine Methode
getView(int position, View convertView, ViewGroup parent)
die für jeden Listen Eintag durchlaufen wird und genau da könntest du die Chechbox für
die Position setzen. Dazu müsstest du entweder eine weitere Liste halten in der die Positionen enthalten sind wo du die Box setzt.
Oder du erweiterst deine DB in der auch das setzen der Box gespeichert wird.
Dazu wirst du auch eine DatensatzUpdate Methode in deinem DBHandler brauchen .
Ich würde die DB Tabelle um eine Spalte erweitern.

Auslesen würde ich die Daten dann nicht nur in einen String sondern in eine DatenStucktur (Klasse) die du dann dem neuen Adapter übergibst. Im Adapter kannst du dann deine Views entsprechend der Daten setzen.
Schaue dir dazu Beispiele zu Custom ListView Adapter im Netzt an.

Using lists in Android wth ListView - Tutorial
Custom ListView Android - Building Custom ListView with Images
 
Zuletzt bearbeitet:
Ähnliche Themen - Listview: Mit Buttonklick neue Zeile, für jede Zeile eigene Layout-Datei Antworten Datum
2
0
6