Обновить ListView с помощью ArrayAdapter

Я разбираю веб-службу для отображения в listView, поддерживаемом моим собственным подклассом ArrayAdapter. Данные static ArrayList<Wait> в Application.java. Вы увидите, что на него ссылается App.getWaits().

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

В прошлом я мог обновить listView, вызвав notifyDataSetChanged() на адаптере, но сейчас ни один из них не работал у меня. Спасибо, что заглянули... есть идеи!?

//1 This is how I'd normally update the listView dynamically, but not tonight.
adapter.notifyDataSetChanged();

//2 It's the same thing really, so no good.
((WaitAdapter) list.getAdapter()).notifyDataSetChanged();

//3 Saw this as the answer to a similar question, doesn't work.
adapter.getWaits().clear();
adapter.getWaits().addAll(App.getWaits());
adapter.notifyDataSetChanged();

//4 Called in onCreate but tried a 2nd time in refresh() to manually reset adapter, doesn't work.
adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);

//5 Kinda the same thing, new adapter, reset adapter... also no good.
WaitAdapter adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);

//6 I read ArrayAdapter keeps its own reference to initial data object but this fails too.
adapter = null;
adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);

* Обновите, чтобы поделиться своим WaitAdapter.java.

public class WaitAdapter extends ArrayAdapter<Wait> {
    private LayoutInflater inflater;
    private ArrayList<Wait> waits;

    public WaitAdapter(Context context, ArrayList<Wait> data) {
        super(context, R.layout.list_item_wait, data);
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        waits = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item_wait, parent, false);
            holder = new ViewHolder();

            holder.checkpointName = (TextView) convertView.findViewById(R.id.checkpointName);
            holder.delayAmount = (TextView) convertView.findViewById(R.id.delayAmount);
            holder.timeReported = (TextView) convertView.findViewById(R.id.timeReported);
            holder.dateReported = (TextView) convertView.findViewById(R.id.dateReported);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Wait wait = waits.get(position);
        holder.checkpointName.setText(wait.getName());
        holder.delayAmount.setText(wait.getDelayInMinutes());
        holder.timeReported.setText(wait.getTimeLabel());
        holder.dateReported.setText(wait.getDateLabel());
        return convertView;
    }

    @Override
    public boolean isEnabled(int position) {
        return false;
    }

    static class ViewHolder {
        TextView checkpointName;
        TextView delayAmount;
        TextView timeReported;
        TextView dateReported;
    }
}

Обновление 14 декабря 2014 года: общие сведения о реализации.

При запуске класс App запускает WaitAsyncTask, который анализирует удаленный XML, чтобы заполнить ожидания ArrayList. Я буду получать доступ к этим ожиданиям в нескольких местах, поэтому я буду держать их глобальными.

WaitFragment, работающий с WaitAdapter, отображает ожидания в ListView и прослушивает изменения в ожиданиях. Пользователь может публиковать ожидания в веб-службе через AlertDialog. Успешный ответ снова выполняет WaitAsyncTask, обновляя объект ожидания и запуская функцию обновления WaitFragment().

Журналы консоли и веб-служба подтверждают этот поток управления и ожидание обновления. Если я выйду из WaitFragment, а затем вернусь, он покажет обновленные ожидания. Код, размещенный с комментариями № 1-6, — это то, что я пробовал внутри Refresh() для обновления ListView.

Я использую этот общий подход с другими данными и фрагментами в этом приложении, и их пользовательские интерфейсы обновляются по назначению, но ни один из них не является listView. Я не уверен, что смогу опубликовать больше исходного кода, не редактируя большую его часть, но я поделюсь своими выводами, как только он заработает. Раньше у меня не было проблем с ListView, но это наверняка будет что-то неловкое. Спасибо всем, кто уделил немного времени :)


person es0329    schedule 13.12.2014    source источник
comment
Возможно, ваш массив waits не обновляется новыми данными.   -  person Shvet    schedule 13.12.2014
comment
Вы фильтруете адаптер в любой момент?   -  person Jay Soyer    schedule 13.12.2014
comment
@DhavalGondaliya Я могу подтвердить через журналы консоли, что arrayList обновляется.   -  person es0329    schedule 13.12.2014
comment
@JaySoyer Адаптер никак не фильтруется.   -  person es0329    schedule 13.12.2014
comment
Можете ли вы опубликовать больше кода, показывающего, где вызываются эти методы для обновления ListView? Что-то происходит, но нам нужно больше кода, чтобы понять, что именно.   -  person Jay Soyer    schedule 13.12.2014


Ответы (1)


Просто создайте метод в классе адаптера для обновления/обновления списка следующим образом:

  public class WaitAdapter extends ArrayAdapter<Wait> {
    private LayoutInflater inflater;
    private ArrayList<Wait> waits;

    public WaitAdapter(Context context, ArrayList<Wait> data) {
        super(context, R.layout.list_item_wait, data);
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        waits = data;
    }   

       /**
        * Update content
        */
        public void updateListContent(ArrayList<Wait> data)
        {
        waits = data;
        notifyDataSetChanged();
        }
     }

В своем классе активности просто вызовите этот метод адаптера, чтобы обновить содержимое. Обратитесь к приведенному ниже коду

Примечание. Не очищайте содержимое массива адаптера.

  //Dont clear the arraylist of adapter
  adapter.updateListContent(App.getWaits());

Это может помочь вам.

person Jayaprakash Marshal    schedule 13.12.2014
comment
Это не помогло, но я ценю ваше отношение к этому. - person es0329; 13.12.2014