Как обновить `ListView` в соответствии с` ArrayList`?

У меня есть массив контактов, которые я постоянно обновляю. Я хочу, чтобы мой ListView обновлялся моими контактами.

Должен ли я использовать Adapter для этого? Я не могу найти много информации о Adapter в Интернете, так как я могу убедиться, что в моем списке всегда есть содержимое моего Array? (Я изучаю это в течение 4 с половиной часов!)

Например, если у меня есть массив с содержимым "apple" и "orange", тогда мой список должен также сказать "apple" и "orange".

Если я решил удалить "apple", тогда мой список должен сказать только "orange". В принципе, мой список всегда должен быть таким же, как мой массив.

Я видел этот, но тогда как я могу удалить и добавить в свой список больше элементов?

Ответ 1

Создайте ListAdapter примерно так.

public class MyListAdapter extends BaseAdapter {


  private ArrayList<String> names = new ArrayList();

  @Override
  public int getCount() {
    return names.length;
  }

  @Override
  public Object getItem(int location) {
    return names[location];
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  private static class ViewHolder {
    public TextView listViewNgoName, listViewDistance, listViewRating, listViewAbout, ngoIcon;
  }

  public MyListAdapter(
      ArrayList names) {
    this.names = names;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
     // Write code for instantiating a row based view.
    return convertView;
  }
}

Теперь в вашей деятельности

    ArrayList<String> names = new ArrayList();
    names.add("oranges");
    names.add("apple");
    ListView listView = (ListView) findViewById(R.id.listview);
    MyListAdapter adapter = new MyListAdapter(names);
    listView.setAdapter(adapter);

Предположим, вам нужно обновить список, нажав кнопку. то есть. при нажатии кнопки значения в вашем массиве меняются, и вы хотите обновить listView.

Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        names.add("payaya");
        names.add("grapes");
        adapter.notifyDataSetChanged();
      }
    });

Я не написал весь код. Просто начальство для вас.

Ответ 2

Итак, вы должны уведомить адаптер ListView о том, что данные были изменены.

listViewAdapater.notifyDataSetChanged();

надеюсь, это сработает

Ответ 3

Вместо Массив, я рекомендую использовать ArrayList.

Преимущество ArrayList над массивом заключается в том, что массивы требуют фиксированного размера. Итак, если вы инициализируете Array

String names[] = new String[10];

размер равен 10, а при установке в ListView ListView отобразит 10 списков, хотя есть имя только в 8 позициях массива

Если вы используете ArrayList, вам не нужно беспокоиться о размере, так как он может масштабироваться вверх и вниз

List<String> names = new ArrayList<>();
names.add("Raul");
names.add("Khan");
names.remove(1);

add() добавляет элемент в список, а remove() удаляет элемент.

Что касается вашего ответа, скажите, что у вас есть ArrayList элементов

и когда у вас есть новый элемент для добавления в список, просто добавьте его в свой ArrayList с помощью метода add() и, наконец, вызовите notifyDataSetChanged() в ArrayAdapter.

И ДА, вам нужно использовать ArrayAdapter, как этот

ArrayList<String> namesList = new ArrayList<>();
ArrayAdapter arrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, namesList);

И когда у вас есть изменения в списке, т.е. когда вы добавляете элементы в свой список, вызовите notifyDataSetChanged() на arrayAdapter.


Ответ 4

используйте ArrayList вместо Array[], вам не нужно инициализировать размер для ArrayList, поэтому он более гибкий, чем Array[]. и он будет автоматически масштабироваться вверх или вниз, если вы add или delete элементы внутри

Ответ 5

Обычно у меня есть метод setData(List<whatever> data) в моем Adapter. Мой Adapter можно сказать в Activity. Когда в моей деятельности я получаю обновленный массив из где бы то ни было, я вызываю setData() с новым массивом, содержащим обновленный массив.

В моем адаптере у меня есть поле, определенное как: private List<Whatever> mItems. Я использую это поле в методе getCount() Adapter для получения элементов списка, в основном я использую этот список для заполнения ListView.

То, что я делаю в setData(), присваивает data mItems, и я вызываю notifyDataSetchanged(), который обновляет ListView, и на этот раз он будет использовать вновь установленные значения данных, поэтому все обновляется до соответствующего состояние.

UPDATE

У меня нет быстрого доступа к адаптеру для ListView, но нужно сделать это ниже, это для ViewPager, но принцип тот же:

public class AdapterTweets extends PagerAdapter {
    private List<Tweet> mItems;

    // [...]

    @Override
    public int getCount() {
        return mItems == null ? 0 : mItems.size();
    }

    // [...]

    public void setData(List<Tweet> items) {
        mItems = items;
        notifyDataSetChanged();
    }
}