Обновете 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.12.2014 г. Актуализация: Обща информация за внедряването.

При стартиране класът App стартира WaitAsyncTask, който анализира отдалечен XML, за да запълни своите ArrayList чакания. Ще имам достъп до тези чакания на няколко места, така че по този начин ги поддържам глобални.

WaitFragment, работещ с WaitAdapter, показва чаканията в ListView и следи за промени в чаканията. Потребителите могат да публикуват чакания в уеб услугата чрез AlertDialog. Успешен отговор изпълнява отново WaitAsyncTask, актуализирайки обекта на чакане, задействайки WaitFragment refresh().

Регистрационните файлове на конзолата и уеб услугата потвърждават този поток от контрол и това изчакване се актуализира. Ако напусна WaitFragment и след това се върна, той показва актуализираните чакания. Кодът, публикуван с коментари #1-6, е това, което опитах вътре в refresh(), за да актуализирам ListView.

Използвам този общ подход с други данни и фрагменти в това приложение и техните потребителски интерфейси се опресняват по предназначение, но никой не е listView. Не съм сигурен, че мога да публикувам още източник, без да редактирам по-голямата част от него, но ще споделя констатациите си, след като го накарам да работи. Не съм имал проблеми с ListView преди, но със сигурност ще бъде нещо неудобно. Благодаря на всички, които отделиха малко време :)


person es0329    schedule 13.12.2014    source източник
comment
Възможно е вашият arraylist 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