Динамически добавлять элементы в списокView Android
Может ли кто-нибудь объяснить или предложить учебник для создания listView в Android?
Вот мои требования:
- Я должен иметь возможность динамически добавлять новые элементы, нажимая кнопку.
- Должно быть достаточно простым для понимания (возможно, без каких-либо улучшений производительности или преобразования viewview, например)
Я знаю, что в этой теме есть довольно много вопросов, размещенных здесь, в StackOverflow, но не удалось найти ответы на мой вопрос. Благодаря!
- Уведомление о облачных сообщениях Firebase, которое не получено устройством
- proguard hell - не может найти ссылочный class
- Как добавить новую активность в существующий проект в Android Studio?
- Как запустить приложение Android Calendar с помощью Intent (Froyo)
- View's getWidth () и getHeight () возвращает 0
- Увеличение и уменьшение масштаба изображения в Android
- Ошибка получения родительского элемента для элемента: ресурс не найден, который соответствует указанному имени после обновления до AppCompat v23
- Gradle - Что такое ненулевое значение выхода и как его исправить?
- Закругленная кнопка в Android
- Просмотр списка Android-файлов Drag and Drop
- Как динамически обновлять ListView на Android
- android Множественный выбор ListView & Textview
- Firebase FCM force onTokenRefresh () будет называться
Сначала создайте 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.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.
Скриншот