Android ListView不像我想要的那样工作

时间:2011-03-28 19:10:06

标签: android listview calendar

我是Android新手,自从我使用Java以来​​已经有一段时间了,我只是想自己创造一些东西。基本上我最终复制了这个Android Custom Listview Tutorial的代码,我试图修改它,这样我就可以创建一个具有一些特殊行为的日历视图。此时,我只想让它显示当前月份,并使用不同的背景颜色显示星期日和当天。这是我的适配器类版本:

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 个答案:

答案 0 :(得分:2)

http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:cacheColorHint在listview的xml声明中设置此属性。设置所需的背景。

android:cacheColorHint="@color/bmy_background"

答案 1 :(得分:1)

你想要了解这里发生的事情是对的。

Romain Guy on the Android website解释并且是优化。

要使用透明,请在XML文件中设置android:cacheColorHint =“#00000000”。

答案 2 :(得分:1)

您还需要在颜色设置中提供默认大小写if语句:

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 setter工作正常,因为它们是无条件触发的。