ListView, ArrayAdapter и метод notifyDataSetChanged

| 30.07.2014

Мы уже разбирали ранее несколько простейших примеров работы со списком ListView. Мы создавали массив элементов (список), присваивали его адаптеру и добавляли последний в layout. Отображаемый список элементов, конечно же, может меняться по мере добавления новых элементов. При этом нам не нужно создавать много лишнего кода, чтобы обновить layout. Рассмотрим, как это можно сделать.

Создадим приложение с одним Активити, где на экране будет отображаться кнопка и список из нескольких чисел. При нажатии на кнопку будет создаваться новое случайное число и добавляться в список.

Код LinearLayoutres/layout/activity_main.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="btnClick"/>
 
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

Для кнопки прописан атрибут android:onClick, который все клики будет адресовать методу btnClick.

Код MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package ru.androiddocs.notifylist;
 
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.view.View;
 
import java.util.ArrayList;
import java.util.List;
 
 
public class MainActivity extends ActionBarActivity {
 
    private static final int MIN = 1;
    private static final int MAX = 100;
    private List<String> mNumbers;
 
    private ArrayAdapter<String> mAdapter;
    private ListView mListView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mListView = (ListView) findViewById(R.id.lv);
 
        mNumbers = new ArrayList<String>();
        // добавим в список несколько чисел
        mNumbers.add("5");
        mNumbers.add("3");
 
        mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mNumbers);
        mListView.setAdapter(mAdapter);
 
 
    }
 
    public void btnClick(View v) {
        // получаем новое случайное число
        int rand = MIN + (int) (Math.random() * ((MAX - MIN) + 1));
        // добавляем его в список
        mNumbers.add(rand + "");
        // обновляем отображаемый список
        mAdapter.notifyDataSetChanged();
    }
}

Как видите, код оказался на удивление простым. Для обновления списка после добавления нового элемента нам достаточно вызвать метод адаптера notifyDataSetChanged(). Не нужно самим «чистить экран» и создавать все с нуля.

ListView, ArrayAdapter и метод notifyDataSetChanged

Но что если добавление новых элементов в список происходит в разных частях кода? Нам придется добавлять метод notifyDataSetChanged(), получается, после каждого такого кода. Не расстраивайтесь, есть простое решение.

Видоизменим код. Добавим метод setNotifyOnChange() после создания адаптера:

1
2
3
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mNumbers);
mAdapter.setNotifyOnChange(true);
mListView.setAdapter(mAdapter);

Методом setNotifyOnChange() мы устанавливаем флаг mNotifyOnChange (свойство класса ArrayAdapter) в значение true, что заставит адаптер обновлять список после каждого добавления нового элемента. Теперь нет нужды использовать метод notifyDataSetChanged(), а новые элементы будем добавлять непосредственно в адаптер:

1
2
3
4
public void btnClick(View v) {
    int rand = MIN + (int) (Math.random() * ((MAX - MIN) + 1));
    mAdapter.add(rand + "");       
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*