web-dev-qa-db-fra.com

Ajouter dynamiquement des éléments à un listView Android

Quelqu'un peut-il expliquer ou suggérer un tutoriel pour créer un listView dans Android?

Voici mes exigences:

  • Je devrais pouvoir ajouter dynamiquement de nouveaux éléments en appuyant sur un bouton.
  • Devrait être assez simple à comprendre (éventuellement sans amélioration des performances ou de convertview, par exemple)

Je sais qu'il y a pas mal de questions sur ce sujet, postées ici sur StackOverflow, mais je n'en ai trouvé aucune qui réponde à ma question. Merci!

314
user555217

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

<?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 disposition simple avec un bouton en haut et une vue liste en bas. Notez que la ListView a l'id @Android:id/list qui définit la valeur par défaut ListView et ListActivity.

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 d'origine pour les éléments non complexes.

listItems est une liste qui contient les données affichées dans ListView. Toutes les opérations d’insertion et de retrait doivent être effectuées sur listItems; les changements dans listItems devraient être reflétés dans la vue. Ceci est géré par ArrayAdapter<String> adapter, qui devrait être notifié par:

adapter.notifyDataSetChanged();

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

580
Shardul

au lieu de

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

vous pouvez appeler directement

adapter.add("New Item");
61
venkat530

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é

54
Robert

Si vous souhaitez avoir le ListView dans une AppCompatActivity au lieu de ListActivity, vous pouvez procéder comme suit (modification de 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"

Alors maintenant, vous pouvez avoir un ListView dans un AppCompatActivity normal.

17
srinivas

Code du 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 du fichier de mise en forme 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>

ScreenShot

enter image description here

10