Android ListView с несколькими типами просмотра не обновляется должным образом - PullRequest
0 голосов
/ 24 сентября 2011

Я пытаюсь создать 3 разные темы для моего списка.Я убедился, что каждая тема будет отображать правильный фоновый макет и привязываться к объектам данных.Проблема, с которой я сталкиваюсь, заключается в том, что после переключения темы в настройках и возврата к основному ViewActivity часто все представления по-прежнему имеют старый макет темы.Пока я не прокручиваю вверх и вниз или не изменяю ориентацию телефона.

Последовательность вызовов onResume () -> updateUI () -> очистить адаптер списка просмотра, добавить новые данные для привязки, вызвать dataSetChanged () ->Пользовательский метод getView () в адаптере просматривает тему и соответственно выбирает правильный вид.

Ниже приведено несколько фрагментов кода (я видел материал типа в видео Google IO) ...

Одна из тем из getView ()

        // bind to the view
        if(convertView == null)
            convertView = vi.inflate(R.layout.viewrow,  parent, false);
        iv = (ImageView) convertView.findViewById(R.id.viewrow_image);
        dt = (TextView) convertView.findViewById(R.id.viewrow_dayview);
        tt = (TextView) convertView.findViewById(R.id.viewrow_toptext);
        bt = (TextView) convertView.findViewById(R.id.viewrow_bottomtext);
        sImage = (ImageView) convertView.findViewById(R.id.viewrow_status);

        // adjust for batch mode
        if (model.isChecked())  convertView.setBackgroundColor(Color.LTGRAY);
        else convertView.setBackgroundResource(0);

        // adjust for completion
        if (model.isComplete()) {
            tt.setPaintFlags(tt.getPaintFlags()
                    | Paint.STRIKE_THRU_TEXT_FLAG);
            sImage.setImageResource(R.drawable.ctask);
        } else {
            tt.setPaintFlags(tt.getPaintFlags()
                    & ~Paint.STRIKE_THRU_TEXT_FLAG);
            sImage.setImageResource(R.drawable.ictask);
        }

        // adjust for priority
        String priority = model.getPriority();
        if (priority.equals("IMMEDIATE")) iv.setImageResource(R.drawable.immediatepriorityicon);
        else if (priority.equals("HIGH")) iv.setImageResource(R.drawable.highpriorityicon);
        else if (priority.equals("MEDIUM")) iv.setImageResource(R.drawable.mediumpriorityicon);
        else iv.setImageResource(R.drawable.lowpriorityicon);

        // update priority preference
        if (!app.api.getCheckPriorityIcon()) iv.setVisibility(View.GONE);
        else iv.setVisibility(View.VISIBLE);

        // color day text
        long days = model.getDueIn();
        if (days > 0) {
            dt.setTextColor(Color.GREEN);
        } else if (days == 0) {
            dt.setTextColor(Color.WHITE);
        } else {
            dt.setTextColor(Color.RED);
        }

        // adjust for completion preference
        // 0 strike
        // 1 text
        // 2 invisible
        int cMode = app.api.getCompletionModeEvent();
        switch (cMode) {
        case 0:
            sImage.setVisibility(View.GONE);
            break;
        case 1:
            tt.setPaintFlags(tt.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
            sImage.setVisibility(View.VISIBLE);
            break;
        case 2:
            tt.setPaintFlags(tt.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
            sImage.setVisibility(View.GONE); 
            break;
        }

        break;

updateUIList () делает:

protected void updateUIList()
{
    eventAdapter.clear();      

    if(selectedDate == null)
    {
        if(app.api.getShowCompleteEvents())
            allEvents = app.edo.getAllEvents();
        else
            allEvents = app.edo.getIncompleteEvents();

        if(eventFilter != null){
            allEvents = eventFilter.filterEvents(allEvents);
        }

        allEvents = preferenceSort(allEvents);

        int count = 0;
        if(allEvents != null)
            count = allEvents.size();

        setTitle(app.APP_TITLE + ": All Entries (" + count + ")");
    }
    else
    {       
        allEvents = preferenceSort(app.edo.searchByDate(selectedDate, !app.api.getShowCompleteEvents()));

        int count = 0;
        if(allEvents != null)
            count = allEvents.size();

        setTitle(app.APP_TITLE + ": Entries on " + selectedDate + " (" + count + ")");
    }


    // if we have no events, hide our list view and display the static "No Tasks" text, otherwise show it.
    if(allEvents == null)
    {
        emptyTextView.setVisibility(View.VISIBLE);
        eventContainer.setVisibility(View.GONE);
        return;
    }

    if(emptyTextView.getVisibility() == View.VISIBLE)
    {
        emptyTextView.setVisibility(View.GONE); 
    }
    if(eventContainer.getVisibility() == View.GONE)
    {
        eventContainer.setVisibility(View.VISIBLE);
    }

    for(Event anEvent : allEvents)
    {
        eventAdapter.add(anEvent);
    }

    eventAdapter.notifyDataSetChanged();
}
`

и типы тем:

    @Override
public int getViewTypeCount() {
    // TODO should correspond to themes array
    return 3;
}
@Override
public int getItemViewType(int position) {
    if(position == 0){
        theme = app.api.getThemeView();
    }
    return theme;
}

Спасибо.

...