我是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参数的值重置。
答案 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工作正常,因为它们是无条件触发的。