So fügen Sie einer ListView in Android dynamisch Elemente hinzu

326

Kann jemand ein Tutorial erklären oder vorschlagen, um eine listView in Android zu erstellen?

Hier sind meine Anforderungen:

  • Ich sollte in der Lage sein, neue Elemente dynamisch per Knopfdruck hinzuzufügen.
  • Sollte einfach zu verstehen sein (möglicherweise ohne Leistungsverbesserungen oder Convertview zum Beispiel)

Ich weiß, dass es zu diesem Thema einige Fragen gibt, die hier auf StackOverflow veröffentlicht wurden, konnte aber keine finden, die meine Frage beantworten würden. Vielen Dank!

user555217
quelle
3
Die derzeit am höchsten bewertete Antwort von Shardul wird als qualitativ hochwertig eingestuft, und die Benutzer haben zum Ausdruck gebracht, dass sie der Meinung sind, dass sie akzeptiert werden sollten. Können Sie es akzeptieren?
Matt Welke

Antworten:

583

Erstellen Sie zuerst ein XML-Layout im res/layout/main.xmlOrdner Ihres Projekts :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Button
        android:id="@+id/addBtn"
        android:text="Add New Item"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="addItems"/>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
    />
</LinearLayout>

Dies ist ein einfaches Layout mit einer Schaltfläche oben und einer Listenansicht unten. Beachten Sie, dass der ListViewdie ID hat, @android:id/listdie den Standard definiert, den ListViewa verwenden ListActivitykann.

public class ListViewDemo extends ListActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        adapter=new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,
            listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }
}

android.R.layout.simple_list_item_1 ist das Standardlayout für Listenelemente, das von Android bereitgestellt wird, und Sie können dieses Bestandslayout für nicht komplexe Dinge verwenden.

listItemsist eine Liste, die die in der ListView angezeigten Daten enthält. Das Einsetzen und Entfernen sollte am erfolgen listItems. Die Änderungen in listItemssollten sich in der Ansicht widerspiegeln. Das wird erledigt von ArrayAdapter<String> adapter, was benachrichtigt werden sollte mit:

adapter.notifyDataSetChanged();

Ein Adapter wird mit 3 Parametern instanziiert: dem Kontext, der Ihr sein könnte activity/listactivity; das Layout Ihres individuellen Listenelements; und schließlich die Liste, bei der es sich um die tatsächlichen Daten handelt, die in der Liste angezeigt werden sollen.

Shardul
quelle
2
Ich verstehe nicht, wie sich die ListView hier an unsere Aktivitäten anhängt.
Breedly
7
@Breedly Weil es sich um eine ListActivity handelt und nicht um eine Aktivität, die ein Layout mit einer ListView hat . Sie müssen die Ansicht der ID nicht finden. Wie Sie in der Referenz lesen können : ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object. Standardmäßig befinden sich die Methoden (wie setAdapter usw.) "innerhalb" der Klasse.
fllo
Lassen Sie uns Glück zeigen, wenn die richtige Antwort erhalten wird: /
support_ms
1
Wenn das Element in ArrayList komplizierter ist, z. B. das Laden aus dem Internet, und jedes Element Bildvideos und ähnliches enthält, würde dieser Ansatz die Leistung beeinträchtigen?
Zionpi
1
Wie könnte ich das in einem Fragment implementieren?
Oamar Kanji
64

anstatt

listItems.add("New Item");
adapter.notifyDataSetChanged();

Sie können direkt anrufen

adapter.add("New Item");
venkat530
quelle
@gumuruh Der Adapter selbst ist veränderbar, sodass wir direkt Objekte hinzufügen oder entfernen können, die automatisch notifyDatasetChanged () und getView () von listView aufrufen. Dies reduziert die zusätzliche Codezeile.
venkat530
Rufen Sie also durch Hinzufügen zum Adapter automatisch notifyDatasetChanged () auf. Oh, ich verstehe. Danke @ venkat530. Aber was ist mit der Liste selbst? Ich meine, wenn wir zuerst sagen, er hat eine Arrayliste erstellt, die als Datencontainer für den Adapter verwendet wird. Und jetzt fügen Sie einfach einen Artikel direkt zum Adapter hinzu, anstatt zur Arrayliste. Würden die Arraylistendaten aktualisiert / unberührt bleiben?
Gumuruh
1
@gumuruh die zweite ist die beste Praxis, weil synchronisiert ist.
Ricardo
1
@gumuruh aus flüchtigen Experimenten und dem ArrayAdapter-Quellcode [ github.com/android/platform_frameworks_base/blob/master/core/… , es sieht so aus, als würde auch der zugrunde liegende Datensatz geändert.
CCJ
Ich habe Sharduls Antwort zum Laufen gebracht, sie dann gebrochen und konnte nicht herausfinden, wie ich sie reparieren kann. Aus einer Laune heraus dachte ich, ich würde es ausprobieren, und voila, es funktioniert wieder! Vielen Dank! Ich habe jedoch keine Ahnung, wie oder warum es das Problem behoben hat. Irgendeine Idee?
Donutguy640
55

Zuerst müssen Sie eine ListView, einen EditText und eine Schaltfläche zu Ihrer activity_main.xml hinzufügen.

Jetzt in Ihrem ActivityMain:

private EditText editTxt;
private Button btn;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;

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

    editTxt = (EditText) findViewById(R.id.editText);
    btn = (Button) findViewById(R.id.button);
    list = (ListView) findViewById(R.id.listView);
    arrayList = new ArrayList<String>();

    // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
    // and the array that contains the data
    adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);

    // Here, you set the data in your ListView
    list.setAdapter(adapter);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // this line adds the data of your EditText and puts in your array
            arrayList.add(editTxt.getText().toString());
            // next thing you have to do is check if your adapter has changed
            adapter.notifyDataSetChanged();
        }
    });
}

Das funktioniert bei mir, ich hoffe ich habe dir geholfen

Robert
quelle
4
Sehr gute Erklärung und besonders danke für die Erklärung des Adapterelements - das in den Beispielen aller anderen magisch zu erscheinen scheint. :)
Raddevus
1
Dies ist das beste Beispiel, das ich dafür gefunden habe :)
Dinuka Salwathura
Diese Antwort erfüllte die Anforderungen der Person. Einfach und sauber ohne komplizierte Verbesserungen. Die beste Antwort führt ListActivity ein, von der nur Großmeister wissen. Mein einziges Problem ist jetzt, wie ich Drawables und andere Dinge zu Ansichten in der Liste hinzufüge. Mir scheint, ich füge nur Zeichenfolgen hinzu.
Eine Optimierung könnte darin bestehen, ein unbenanntes Listenobjekt in Adapter zu erstellen, als einen 16-Bit-Zeiger auf ein Listenobjekt zu erstellen. Dies wird nach dem Erstellen des Adapters nicht benötigt, da der Adapter über eine Add-Methode verfügt.
17

Wenn Sie die ListView in einer AppCompatActivity anstelle von ListActivity haben möchten, können Sie Folgendes tun (Ändern der Antwort von @ Shardul):

public class ListViewDemoActivity extends AppCompatActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;
    private ListView mListView;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_list_view_demo);

        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }

        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }

    protected ListView getListView() {
        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }
        return mListView;
    }

    protected void setListAdapter(ListAdapter adapter) {
        getListView().setAdapter(adapter);
    }

    protected ListAdapter getListAdapter() {
        ListAdapter adapter = getListView().getAdapter();
        if (adapter instanceof HeaderViewListAdapter) {
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }
}

Und in Ihrem Layout android:id="@android:id/list"können Sie anstelle von verwendenandroid:id="@+id/listDemo"

So, jetzt können Sie ein ListViewInneres in einem normalen haben AppCompatActivity.

Srinivas
quelle
12

Code für die Datei MainActivity.java.

public class MainActivity extends Activity {

    ListView listview;
    Button Addbutton;
    EditText GetValue;
    String[] ListElements = new String[] {
        "Android",
        "PHP"
    };

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

        listview = (ListView) findViewById(R.id.listView1);
        Addbutton = (Button) findViewById(R.id.button1);
        GetValue = (EditText) findViewById(R.id.editText1);

        final List < String > ListElementsArrayList = new ArrayList < String >
            (Arrays.asList(ListElements));


        final ArrayAdapter < String > adapter = new ArrayAdapter < String >
            (MainActivity.this, android.R.layout.simple_list_item_1,
                ListElementsArrayList);

        listview.setAdapter(adapter);

        Addbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                ListElementsArrayList.add(GetValue.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
    }
}

Code für die Layoutdatei activity_main.xml.

<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"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.listviewaddelementsdynamically_android_examples
    .com.MainActivity" >

  <Button
    android:id="@+id/button1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editText1"
    android:layout_centerHorizontal="true"
    android:text="ADD Values to listview" />

  <EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="26dp"
    android:ems="10"
    android:hint="Add elements listView" />

  <ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_centerHorizontal="true" >
  </ListView>

</RelativeLayout>

Bildschirmfoto

Geben Sie hier die Bildbeschreibung ein

Amir Hosseinzadeh
quelle
0

Die kurze Antwort: Wenn Sie eine ListView erstellen, übergeben Sie ihr einen Verweis auf die Daten. Wenn diese Daten geändert werden, wirkt sich dies auf die Listenansicht aus und fügt das Element hinzu, nachdem Sie adapter.notifyDataSetChanged (); aufgerufen haben.

Wenn Sie eine RecyclerView verwenden, aktualisieren Sie nur das letzte Element (wenn Sie es am Ende der Liste der Objekte hinzugefügt haben), um Speicherplatz zu sparen mit: mAdapter.notifyItemInserted (mItems.size () - 1);

Oz Shabat
quelle
0

Dies ist die einfache Antwort, wie man Daten dynamisch in Listview Android Kotlin hinzufügt

class MainActivity : AppCompatActivity(){

    var listItems = arrayListOf<String>()
    val array = arrayOf("a","b","c","d","e")
    var listView: ListView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.scrollview_layout)

        listItems.add("a")
        listItems.add("b")
        listItems.add("c")
        listItems.add("d")
        listItems.add("e")

        //if you want to add array items to a list you can try this for each loop
        for(items in array)
            listItems.add(items)
        Log.e("TAG","listItems array: $listItems")

    }
}

Hier habe ich nur zwei Möglichkeiten erklärt, wir können dies auf viele Arten tun.

sirajudheen tk
quelle
Wo ist der Teil, den Sie der ListView hinzufügen?
Onie Maniego
@OnieManiego hier habe ich die Elemente auf zwei Arten zur Listenansicht hinzugefügt. Sie können dies oben sehen. 1. listItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d ") listItems.add (" e ") Dies ist der erste Weg, den ich hinzugefügt habe. 2. Für (Elemente im Array) listItems.add (Elemente) Der zweite Weg, auf dem ich alle Elemente aus dem Array hinzugefügt habe
sirajudheen tk
Ist das nicht das Array, nicht die Listenansicht? danke
Onie Maniego
@OnieManiego Ich hoffe du verstehst, wenn das hilfreich für dich ist, bitte stimme zu
sirajudheen tk