2010-12-27 2 views
274

Может ли кто-нибудь объяснить или предложить учебник для создания списка в Android?Динамически добавлять элементы в списокView Android

Вот мои требования:

  • я должен иметь возможность динамически добавлять новые элементы, нажав на кнопку.
  • Должен быть достаточно простым для понимания (возможно, без каких-либо улучшений производительности или convertview, например)

Я знаю, что есть немало вопросов по этой теме, оставленных здесь, на StackOverflow, но не смог найти любой, кто ответит на мой вопрос. Благодаря!

+0

в настоящее время самый высокий проголосовали ответ от Shardul считается высокое качество и пользователи выражают они чувствуют, что должны быть приняты. Можете ли вы принять его? – Welkie

ответ

549

Создание макета XML в первую 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> 

Это простой макет с помощью кнопки на верхней и просмотра списка внизу. Обратите внимание: ListView имеет идентификатор @android:id/list, который определяет значение по умолчанию ListView, которое может использоваться 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 макет по умолчанию элемент списка поставляется Android, и вы можете использовать этот запас макет для несложных вещей.

listItems - это список, содержащий данные, отображаемые в ListView. Все вставки и удаления должны быть сделаны на listItems; изменения в listItems должны быть отражены в представлении. Это обрабатывается с помощью ArrayAdapter<String> adapter, которые должны быть уведомлены с помощью:

adapter.notifyDataSetChanged();

Адаптер инстанцирован с 3-мя параметрами: контекст, который может быть вашим activity/listactivity; расположение вашего индивидуального элемента списка; и, наконец, список, который является фактическими данными, которые будут отображаться в списке.

+21

кажется, что он не доволен ;-) – Saqib

+2

Я не понимаю, как ListView присоединяется к нашей деятельности здесь. – Breedly

+7

@Breedly Потому что это ** ListActivity **, а не ** Деятельность, которая имеет макет с ListView **. Вам не нужно искать представление id. Как вы можете прочитать в Reference: 'ListActivity - это действие, которое по умолчанию включает ListView в качестве единственного элемента компоновки. [...] (он) содержит объект ListView'. Таким образом, по умолчанию методы (как * setAdapter * и т. Д.) Являются «внутри» класса. – Fllo

50

вместо

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

вы можете напрямую позвонить

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

какая разница @ venkat530? Это лучшая практика или ... что-то? – gumuruh

+0

@gumuruh сам адаптер изменен, поэтому мы можем напрямую добавлять или удалять объекты, которые будут автоматически вызывать notifyDatasetChanged() и getView() listView. Это уменьшает дополнительную строку кода. – venkat530

+0

поэтому, добавив в адаптер, автоматически вызывайте notifyDatasetChanged()? О, я вижу. Спасибо @ venkat530. Но как насчет самого списка? Я имею в виду, если сначала скажем, что он создал arraylist, который использовался в качестве контейнера данных для адаптера. И теперь вы просто добавляете элемент непосредственно к адаптеру вместо этого в arraylist. Обновлены ли данные arraylist/нетронутыми? – gumuruh

39

Во-первых, вы должны добавить ListView, в EditText и кнопки в вашем activity_main.xml.

Теперь в вашем 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(); 
     } 
    }); 
} 

Это работает для меня, я надеюсь, что я помог вам

+2

Очень хорошее объяснение и спасибо, особенно для объяснения элемента адаптера, который, кажется, волшебным образом появляется на всех остальных примерах. :) – raddevus

16

Если вы хотите иметь ListView в качестве AppCompatActivity вместо ListActivity, вы можете сделать следующее (Изменение @ ответ 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; 
     } 
    } 
} 

И Планируя вместо использования android:id="@android:id/list" вы можете использовать android:id="@+id/listDemo"

Итак, теперь у вас может быть ListView внутри нормального AppCompatActivity.

5

Код для файла 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(); 
      } 
     }); 
    } 
} 

Код для 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

Смежные вопросы