Не удалось обновить ListView с помощью SimpleAdapter

Я пытаюсь добавить новую запись в свой список и обновить ее, при этом старая запись все еще отображается в списке. Раньше я использовал ArrayAdapter, который я мог обновить после добавления новой записи с помощью

 adapter.notifyDataSetChanged();

Но я не могу использовать приведенный выше код с SimpleAdapter. Любое предложение? Я пробовал пару решений, но пока ничего не сработало.

Ниже приведен код, который я использую, который не добавляет запись:

void beta3 (String X, String Y){
    //listview in the main activity
    ListView POST = (ListView)findViewById(R.id.listView);
    //list = new ArrayList<String>();
    String data = bar.getText().toString();
    String two= data.replace("X", "");
    ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();

    HashMap<String,String> event = new HashMap<String, String>();
    event.put(Config.TAG_one, X);
    event.put(Config.TAG_two, two);
    event.put(Config.TAG_three, Y);
    list.add(event);
    ListAdapter adapter = new SimpleAdapter(this, list, R.layout.list,
            new String[]{Config.TAG_one, Config.TAG_two, Config.TAG_three},
            new int[]{R.id.one, R.id.two, R.id.three});        
    POST.setAdapter(adapter);
}

person Lockon    schedule 10.09.2016    source источник
comment
Похоже на дубликат этого. Как вы пытаетесь добавить элемент в список?   -  person gus27    schedule 10.09.2016


Ответы (1)


Если ваш метод beta3 действительно является вашей функцией для добавления новой записи в ваш ListView: он будет устанавливать новый адаптер с новым списком каждый раз, когда вы его вызываете. Так что это всегда будет приводить к ListView, содержащему одну запись. После выхода из метода beta3 ссылка на список пропала.

Вы должны повторно использовать переменную экземпляра list. Поместите ArrayList<HashMap<String,String>> list в класс/деятельность и инициализируйте его один раз (например, в onCreate()).

Другая проблема заключается в том, что вы используете переменную ListAdapter в качестве ссылки на экземпляр SimpleAdapter. ListAdapter — это интерфейс, который не предоставляет метод notifyDataSetChanged. Вместо этого вы должны использовать переменную SimpleAdapter.

Вот пример:

public class MyActivity {

    ArrayList<HashMap<String,String>> list;
    SimpleAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        ListView POST = (ListView)findViewById(R.id.listView);
        list = new ArrayList<HashMap<String, String>>();
        adapter = new SimpleAdapter(this, list, R.layout.list,
            new String[]{Config.TAG_one, Config.TAG_two, Config.TAG_three},
            new int[]{R.id.one, R.id.two, R.id.three});        
        POST.setAdapter(adapter);
    }


    void beta3 (String X, String Y){
        String two = ""; // adapt this to your needs
        ...
        HashMap<String,String> event = new HashMap<String, String>();
        event.put(Config.TAG_one, X);
        event.put(Config.TAG_two, two);
        event.put(Config.TAG_three, Y);
        list.add(event);
        adapter.notifyDataSetChanged();
    }

}
person gus27    schedule 10.09.2016
comment
мой проект захватывает данные/строку из базы данных в телефоне Android и передает данные/строку в beta3() и показывает их в списке. не могли бы вы дать мне пример кода, чтобы я мог с ним работать? - person Lockon; 10.09.2016
comment
я пробовал ваш код. у меня ошибка в части notifyDataSetChanged(). без него приложение работает, но в списке ничего не отображается. - person Lockon; 10.09.2016
comment
notifyDataSetChanged() отображается красным цветом. При наведении указателя мыши на него не удается разрешить метод 'notifyDataSetChanged()' - person Lockon; 10.09.2016
comment
Замените ListAdapter на SimpleAdapter. Пример кода исправлен. - person gus27; 10.09.2016
comment
Я проверил и заменил ListAdapter на SimpleAdapter, но теперь я получаю java.lang.NullPointerException с notifyDataSetChanged() - person Lockon; 10.09.2016
comment
Вы неправильно инициализировали adapter или вызываете beta3, когда adapter еще не инициализирован. Сколько раз термин SimpleAdapter встречается в вашем коде? - person gus27; 10.09.2016
comment
он заработал, но он обновил мой список, но старая запись была удалена, а новая заменила ее. Я также использую viewpager в своем приложении. - person Lockon; 10.09.2016
comment
я запускаю beta3 с помощью кнопки на вкладке 2, которая использовалась в viewpager - person Lockon; 10.09.2016
comment
Если старый элемент исчезнет, ​​значит, с вашим кодом все еще что-то не так. Пожалуйста, внимательно сравните его с моим образцом. - person gus27; 10.09.2016
comment
Вы можете попытаться упростить свой код и добавить кнопку в то же представление, которое содержит ваш список. Просто чтобы отследить ошибку... - person gus27; 10.09.2016
comment
да ты прав. была путаница с моей стороны. пометит как ответ. Спасибо, чувак - person Lockon; 10.09.2016