0

リストビュー用に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;
}

ありがとう。

4

0 に答える 0