Android ListView не работает, как я собираюсь - PullRequest
0 голосов
/ 28 марта 2011

Я новичок в Android, и я давно уже работал с Java, и я просто пытаюсь создать что-то самостоятельно. По сути, я закончил копировать код из этого Обучающего руководства по просмотру пользовательских списков Android , и я пытаюсь изменить его, чтобы создать представление календаря с каким-то особым поведением. На данный момент я просто хочу, чтобы он отображал текущий месяц и отображал воскресенья и текущий день, используя другой цвет фона. Вот моя версия адаптера класса:

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.util.Log;
import android.view.LayoutInflater;

import java.util.Calendar;

public class MonthViewAdapter extends BaseAdapter {

public MonthViewAdapter(Context c) {
    mInflater = LayoutInflater.from(c);
    now = Calendar.getInstance();
}

@Override
public int getCount() {
    int numDays = now.getActualMaximum(Calendar.DAY_OF_MONTH);
    Log.i(this.toString(), "getCount -- numDays = " + numDays);
    return numDays;
}

@Override
public Object getItem(int arg0) {
    return arg0;
}

@Override
public long getItemId(int arg0) {
    return arg0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.main_list_element, null);

        holder = new ViewHolder();
        holder.dateText = (TextView)  convertView.findViewById(R.id.dateText);          
        holder.eventText = (TextView) convertView.findViewById(R.id.eventText);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();

    }

    holder.dateText.setText(String.valueOf(position + 1));
    Log.i(this.toString(), "getView -- dateText = " + holder.dateText.getText());
    holder.eventText.setText("events" + String.valueOf(position + 1));

    Calendar refCal = Calendar.getInstance(); 
    refCal.set(Calendar.DAY_OF_MONTH, position+1);
    if(now.get(Calendar.DAY_OF_MONTH) == position+1)
        convertView.setBackgroundColor(Color.GRAY);
    else if(refCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
        convertView.setBackgroundColor(Color.DKGRAY);

    return convertView;
}

static class ViewHolder {
    TextView dateText;
    TextView eventText;
}

private Context mContext;
private LayoutInflater mInflater;
private Calendar now;

}

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

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:cacheColorHint установите этот атрибут в вашем xml объявлении списка.Установите желаемый фон.

android:cacheColorHint="@color/bmy_background"
1 голос
/ 28 марта 2011

Вам также необходимо указать регистр по умолчанию в настройках цвета, если:

if(now.get(Calendar.DAY_OF_MONTH) == position+1) {
    convertView.setBackgroundColor(Color.GRAY);
} else if(refCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
    convertView.setBackgroundColor(Color.DKGRAY);
} else {
    convertView.setBackgroundColor(Color.BLACK);
}

В противном случае вы не сбрасываете фон для своих переработанных видов.Ваши сеттеры TextView работали правильно, потому что они запускаются безоговорочно.

1 голос
/ 28 марта 2011

Вы правы, что хотите понять, что здесь происходит.

Это объясняется Romain Guy на сайте Android и является оптимизацией.

Чтобы использовать прозрачный, установите android: cacheColorHint = "# 00000000" в вашем XML-файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...