Как обновить `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();
}
}