2010-12-27 20 views
274

Kann jemand ein Tutorial erklären oder vorschlagen, um ein listView in android zu erstellen?Elemente dynamisch zu einem listView Android hinzufügen

Hier sind meine Anforderungen:

  • Ich sollte dynamisch Lage sein, neue Elemente hinzufügen, indem Sie eine Taste drücken.
  • sollten einfach genug sein, um zu verstehen (möglicherweise ohne Leistungsverbesserungen oder convertview, zum Beispiel)

Ich weiß, es gibt durchaus ein paar Fragen zu diesem Thema geschrieben hier auf Stackoverflow, aber nicht finden konnte Irgendwelche, die meine Frage beantworten würden. Vielen Dank!

+0

Die derzeit höchsten gestimmt Antwort von Shardul ist hohe Qualität und Anwender betrachtet haben drückten sie fühlen es akzeptiert werden sollte. Können Sie es akzeptieren? – Welkie

Antwort

549

ein XML-Layout erstellen ersten res/layout/main.xml Ordner in Ihrem Projekt:

<?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> 

Dieses mit einem Knopf auf der Oberseite und eine Listenansicht auf der Unterseite ein einfaches Layout ist. Beachten Sie, dass die ListView die ID @android:id/list hat, die den Standard ListView ein ListActivity verwenden kann.

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 Standard-Listenelement-Layout von Android geliefert, und Sie können dieses Lager-Layout für nicht-komplexe Dinge verwenden.

listItems ist eine Liste, die die in der ListView angezeigten Daten enthält. Das gesamte Einsetzen und Entfernen sollte unter listItems erfolgen; Die Änderungen in listItems sollten sich in der Ansicht widerspiegeln. Das ist von ArrayAdapter<String> adapter behandelt, die unter Verwendung benachrichtigt werden soll:

adapter.notifyDataSetChanged();

Ein Adapter instanziiert mit 3 Parametern: Rahmen, die Ihre activity/listactivity sein könnte; das Layout Ihres individuellen Listeneintrags; und schließlich die Liste, welche die tatsächlichen Daten sind, die in der Liste angezeigt werden sollen.

+21

scheint er nicht glücklich zu sein ;-) – Saqib

+2

Ich verstehe nicht, wie sich der ListView hier an unsere Aktivität anfügt. – Breedly

+7

@Breedly Weil es eine ** ListActivity ** und keine ** Aktivität ist, die ein Layout mit einem ListView ** hat. Sie müssen die Ansicht der ID nicht finden. Wie Sie in der Referenz lesen können: 'ListActivity ist eine Aktivität, die standardmäßig ein ListView als einziges Layoutelement enthält. [...] (it) hostet ein ListView-Objekt'. Also sind die Methoden (als * setAdapter *, usw.) standardmäßig "innerhalb" der Klasse. – Fllo

50

statt

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

können Sie direkt

adapter.add("New Item"); 
+0

Was sind die Unterschiede @ venkat530? Ist es Best Practice oder .... etwas? – gumuruh

+0

@gumuruh der Adapter selbst ist veränderbar, so dass wir Objekte hinzufügen oder entfernen können, die automatisch die notifyDatasetChanged() und getView() von listView aufrufen. Dies reduziert die zusätzliche Codezeile. – venkat530

+0

also durch Hinzufügen in den Adapter automatisch notifyDatasetChanged() aufrufen? Oh, ich verstehe. Danke @ venkat530. Aber was ist mit der Liste selbst? Ich meine, wenn ich sagen würde, dass er zuerst eine Arraylist erstellt hat, die als Datencontainer für den Adapter verwendet wurde. Und jetzt fügen Sie einfach ein Element direkt zum Adapter statt zur Arraylist hinzu. Würden die Arraylist-Daten aktualisiert/unberührt? – gumuruh

39

Zuerst rufen, müssen Sie ein Listview hinzufügen, eine EditText und eine Schaltfläche in Ihre activity_main.xml.

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

Dies funktioniert für mich, ich hoffe, dass ich Ihnen geholfen

+2

Sehr gute Erklärung und danke besonders für die Erläuterung des Adapter-Elements - das scheint magisch in den Beispielen aller anderen erscheinen. :) – raddevus

16

Wenn Sie das Listview in einer AppCompatActivity statt ListActivity haben wollen, können Sie folgendes tun (Ändern @ Shardul Antwort):

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 Sie Layout statt android:id="@android:id/list" verwenden, können Sie verwenden android:id="@+id/listDemo"

So jetzt können Sie eine ListView innerhalb einer normalen AppCompatActivity haben.

5

Code für MainActivity.java-Datei.

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 activity_main.xml Layout-Datei.

<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> 

ScreenShot

enter image description here

Verwandte Themen