Я разбираю веб-службу для отображения в 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, но это наверняка будет что-то неловкое. Спасибо всем, кто уделил немного времени :)
waits
не обновляется новыми данными. - person Shvet   schedule 13.12.2014ListView
? Что-то происходит, но нам нужно больше кода, чтобы понять, что именно. - person Jay Soyer   schedule 13.12.2014