Динамически добавлять элементы в списокView Android

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

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

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

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

Сначала создайте XML-макет в папке res/layout/main.xml вашего проекта:

      

Это простой макет с кнопкой вверху и списком внизу. Обратите внимание, что ListView имеет id @android:id/list который определяет список ListView ListActivity можно использовать по умолчанию.

 public class ListViewDemo extends ListActivity { //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS ArrayList listItems=new ArrayList(); //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW ArrayAdapter 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(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 adapter , который должен быть уведомлен с помощью:

adapter.notifyDataSetChanged();

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

вместо

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

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

 adapter.add("New Item"); 

Во-первых, вы должны добавить ListView, EditText и кнопку в свой Activity_main.xml.

Теперь в вашем ActivityMain:

 private EditText editTxt; private Button btn; private ListView list; private ArrayAdapter adapter; private ArrayList 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(); // 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(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(); } }); } 

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

Если вы хотите иметь ListView в AppCompatActivity, а не ListActivity, вы можете сделать следующее (Изменить ответ Shardul):

 public class ListViewDemoActivity extends AppCompatActivity { //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS ArrayList listItems=new ArrayList(); //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW ArrayAdapter 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(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 .

Код для файла 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.

       

Скриншот

введите описание изображения здесь

  • Эффект тени для текста в Android?
  • Как использовать методы setArguments () и getArguments () во Фрагментах?
  • Как сжать размер изображения?
  • java.lang.NoClassDefFoundError: com.google.firebase.FirebaseOptions
  • Воспроизведение RTSP в приложении для Android
  • Android: временно отключить изменения ориентации в Activity
  • Изображение теряет исходный результат при передаче его другому действию
  • Android.app Фрагменты против android.support.v4.app с помощью ViewPager?
  • Разрешение Firebase при чтении данных после аутентификации
  • Как узнать, прокручивается ли RecyclerView / LinearLayoutManager сверху или снизу?
  • Разница между событием OnClick () и OnClickListener?
  • Interesting Posts

    Семантические URL-адреса с точками в .net

    Spring-Boot: Как установить свойства пула JDBC, например максимальное количество соединений?

    Позволяет ли лицензия запускать Windows 7 на виртуальной машине и на хосте?

    В R-формулах, почему я должен использовать функцию I () на степенных членах, таких как y ~ I (x ^ 3)

    Экспедирование агента SSH не работает

    Невозможно достичь моей электронной почты google с помощью firefox

    configure: ошибка: компилятор C не может создавать исполняемые файлы

    Ошибка разрешения хранилища в Marshmallow

    Проверка, работает ли приложение Android в фоновом режиме

    Персистентная коллекция интерфейса с использованием Hibernate

    Android: В чем разница между Activity.runOnUiThread и View.post?

    Удаленный конец неожиданно повесился, а git cloning

    Могу ли я установить Windows 7 в именах A: \ или B: \?

    Как включить в это регулярное выражение отрицательные десятичные числа?

    DD-WRT – Переадресация на основе хоста

    Давайте будем гением компьютера.