リストビュー用に3つの異なるテーマを作成しようとしています。各テーマが実際に適切な背景レイアウトを表示し、データオブジェクトにバインドすることを確認しました。私が直面している問題は、設定でテーマを切り替えてメインのViewActivityに戻った後でも、多くの場合、すべてのビューに古いテーマのレイアウトが残っていることです。上下にスクロールするか、電話の向きを変更するまで。
呼び出しのシーケンスは、onResume()-> updateUI()->リストビューアダプターをクリアし、バインドする新しいデータを追加し、アダプターでdataSetChanged()->カスタムgetView()を呼び出して、テーマを調べ、それに応じて適切なビューを選択します。
以下はいくつかのコードです(私はGoogle IOビデオでタイプのものを見ました)...
getView()からのテーマの1つ
// 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;
}
ありがとう。