346 votes

Comment ajouter dynamiquement des éléments à une ListView sur Android ?

Quelqu'un peut-il expliquer ou suggérer un tutoriel pour créer de façon dynamique une ListView dans Android ?

Voici mes exigences :

  • Je devrais être en mesure d'ajouter dynamiquement de nouveaux éléments en appuyant sur un bouton.
  • devrait être suffisamment simple à comprendre (éventuellement sans amélioration des performances ou de l'efficacité). convertView par exemple)

Je sais qu'il y a beaucoup de questions sur ce sujet, mais je n'en ai trouvé aucune qui réponde à ma question.

4 votes

La réponse de Shardul qui a obtenu le plus grand nombre de votes est considérée comme étant de haute qualité et les utilisateurs ont exprimé le souhait qu'elle soit acceptée. Pouvez-vous envisager de l'accepter ?

598voto

Shardul Points 10371

Créez d'abord une mise en page XML dans le fichier res/layout/main.xml dossier :

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

Il s'agit d'une mise en page simple avec un bouton en haut et une vue de liste en bas. Notez que le bouton ListView a l'id @android:id/list qui définit l'option par défaut ListView a ListActivity peut utiliser.

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 est la disposition par défaut des éléments de liste fournie par Android, et vous pouvez utiliser cette disposition de base pour les choses non complexes.

listItems est une liste qui contient les données affichées dans le ListView. Toutes les insertions et suppressions doivent être effectuées sur listItems ; les changements dans listItems doit être reflétée dans la vue. C'est géré par ArrayAdapter<String> adapter qui doit être notifié en utilisant :

adapter.notifyDataSetChanged();

Un adaptateur est instancié avec 3 paramètres : le contexte, qui peut être votre activity/listactivity la mise en page de l'élément de liste individuel ; et enfin, la liste, qui correspond aux données réelles à afficher dans la liste.

3 votes

Je ne comprends pas comment le ListView s'attache à notre activité ici.

7 votes

@Breedly Parce que c'est une ListActivity et non un Activité qui a une mise en page avec un ListView . Vous n'avez pas besoin de trouver la vue de l'id. Comme vous pouvez le lire sur la Référence : ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object . Ainsi, par défaut, les méthodes (comme setAdapter etc.) sont "à l'intérieur" de la classe.

0 votes

Montrons notre joie lorsque la bonne réponse est obtenue :/

70voto

venkat530 Points 38

Au lieu de

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

vous pouvez appeler directement

adapter.add("New Item");

0 votes

@gumuruh l'adaptateur lui-même est mutable donc nous pouvons directement ajouter ou supprimer des objets qui appelleront automatiquement les notifyDatasetChanged() et getView() de listView. Cela réduit la ligne de code supplémentaire.

0 votes

Donc en ajoutant dans l'adaptateur un appel automatique à notifyDatasetChanged() ? Oh, je vois. Merci @venkat530. Mais qu'en est-il de la liste elle-même ? Je veux dire que si, tout d'abord, il a créé une liste de tableaux qui a été utilisée comme un conteneur de données pour l'adaptateur. Et maintenant vous ajoutez un élément directement à l'adaptateur au lieu de la liste de tableaux. Est-ce que les données de la liste de tableaux sont mises à jour / non modifiées ?

1 votes

@gumuruh la seconde est la meilleure pratique car elle est synchronisée.

64voto

Robert Points 834

Tout d'abord, vous devez ajouter un ListView, un EditText et un bouton dans votre Activity_main.xml.

Maintenant, dans votre 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();
        }
    });
}

Cela fonctionne pour moi, j'espère vous avoir aidé.

19voto

srinivas Points 130

Si vous voulez avoir le ListView dans un AppCompatActivity au lieu de ListActivity, vous pouvez faire ce qui suit (en modifiant la réponse de @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;
        }
    }
}

Et dans votre mise en page, au lieu d'utiliser android:id="@android:id/list" vous pouvez utiliser android:id="@+id/listDemo"

Donc maintenant vous pouvez avoir un ListView à l'intérieur d'un AppCompatActivity .

17voto

Amir Hoseinzade Points 11

Code pour le fichier 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 pour le fichier de mise en page 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>

Capture d'écran

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X