2010-12-27 20 views
274

¿Alguien puede explicar o sugerir un tutorial para crear una lista de vista en android?Agregue dinámicamente elementos a una listaVer Android

Éstos son mis requisitos:

  • que debería ser capaz de añadir nuevos elementos dinámicamente pulsando un botón.
  • debe ser lo suficientemente sencillo de entender (posiblemente sin ningún tipo de mejoras en el rendimiento o convertview, por ejemplo)

Sé que hay un buen número de preguntas sobre este tema, publicados aquí en StackOverflow, pero no pudo encontrar cualquiera que responda mi pregunta. ¡Gracias!

+0

La respuesta votado más alta actualmente de Shardul se considera de alta calidad y los usuarios han expresado que sienten que debe ser aceptado. ¿Puedes considerar aceptarlo? – Welkie

Respuesta

549

crear un diseño XML por primera vez en la carpeta de su proyecto res/layout/main.xml:

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

Esto es un diseño simple con un botón en la parte superior y una vista de lista en la parte inferior. Tenga en cuenta que el ListView tiene el id @android:id/list que define el valor predeterminado ListView que puede usar 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 es el diseño de lista elemento predeterminado suministrado por Android, y se puede usar la disposición de las cosas no complejos.

listItems es una lista que contiene los datos que se muestran en el ListView. Toda la inserción y eliminación debe hacerse en listItems; los cambios en listItems deben reflejarse en la vista. Eso lo maneja ArrayAdapter<String> adapter, que deberían notificarse utilizando:

adapter.notifyDataSetChanged();

Un adaptador se crea una instancia con 3 parámetros: el contexto, lo que podría ser su activity/listactivity; el diseño de su elemento de lista individual; y, por último, la lista, que es la información real que se mostrará en la lista.

+21

parece que no está contento ;-) – Saqib

+2

No entiendo cómo el ListView se une a nuestra actividad aquí. – Breedly

+7

@Breedly Porque es una ** Actividad de lista ** y no una ** Actividad que tiene un diseño con un Vista de lista **. No necesita encontrar la vista de identificación. Como puede leer en la Referencia: 'ListActivity es una actividad que incluye un ListView como su único elemento de diseño por defecto. [...] (it) aloja un objeto ListView'. Entonces, por defecto, los métodos (como * setAdapter *, etc.) están "dentro" de la Clase. – Fllo

50

en lugar de

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

puede llamar directamente

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

¿cuál es la diferencia @ venkat530? ¿Es una mejor práctica o ... algo? – gumuruh

+0

@gumuruh el adaptador en sí mismo es mutable, por lo que podemos agregar o eliminar directamente objetos que llamarán a notifyDatasetChanged() y getView() de listView automáticamente. Esto reduce la línea de código adicional. – venkat530

+0

por lo que al agregarlo al adaptador se llama automáticamente notifyDatasetChanged()? Oh ya veo. Gracias @ venkat530. ¿Pero qué pasa con la lista en sí? Quiero decir, si dejéramos decir, primero creó una lista de arrays que usó como contenedor de datos para el adaptador. Y ahora solo agrega un elemento directamente al adaptador en lugar de a la lista de arrays. ¿Los datos de la lista de arrays se actualizarán/no se modificarán? – gumuruh

39

En primer lugar, hay que añadir un ListView, un EditarTexto y un botón en su activity_main.xml.

Ahora, en su 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(); 
     } 
    }); 
} 

Esto funciona para mí, espero que te ayudé

+2

Muy buena explicación y gracias especialmente por explicar el artículo del adaptador, que parece aparecer mágicamente en los ejemplos de los demás. :) – raddevus

16

Si usted quiere tener la ListView en un AppCompatActivity en lugar de ListActivity, puede hacer lo siguiente (Modificación de la respuesta 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; 
     } 
    } 
} 

Y en que en lugar de utilizar layout android:id="@android:id/list" puede utilizar android:id="@+id/listDemo"

Así que ahora puede tener un ListView dentro de un AppCompatActivity normal.

5

Código para el archivo 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(); 
      } 
     }); 
    } 
} 

Código de activity_main.xml archivo de diseño.

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

de ScreenShot

enter image description here

Cuestiones relacionadas