Я пытаюсь создать 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;
}
Спасибо.