这周主要是练习了一个小程序,目的是熟悉一下这段日子以来学习的一些控件,让控件和布局看起来更协调,即使旋转手机也不会太影响画面的整体效果。更加深了对控件和布局的使用熟练程度。回顾这一个月来学习的知识以及遇到的问题,觉得在Calendar这个小程序时印象特别深刻。

做这个小程序的时候遇到的比较大的难题就是那个自定义的适配器。代码如下:

class CalendarAdapter extends BaseAdapter {

private LayoutInflater mInflater;

private Context mContext = null;

privateintx;

privateinty;

privateinthour;

public CalendarAdapter(Context context) {

mContext = context;

/* LayoutInflater的作用和findViewById()差不*多, 不同之处在于LayoutInflater是找layout文件夹下 *的某个xml布局文件!而findViewById()是找某一个xml

*下的具体 widget控件。

*/

mInflater = LayoutInflater.from(mContext);

}

// 得到一个Item

public Object getItem(int arg0) {

returnitems.get(arg0);

}


// 得到一个Item的id

publiclong getItemId(int position) {

return position;

}


// 返回Items的总数

publicint getCount() {

returnitems.size();

}


// 由position得到所对应的Item的View,从而进行操作。返回一个convertView,

// BaseAdapter类封装的有方法让Items的所有项都执行此操作

public View getView(int position, View convertView,

android.view.ViewGroup parent) {

final TextView indexText;

// if (convertView == null) {此处出现异常!!!

convertView = mInflater.inflate(R.layout.time02, null);

// }

convertView.setBackgroundColor(Color.WHITE);

indexText = (TextView) convertView.findViewById(R.id.time);

LinearLayout listItem = (LinearLayout) convertView

.findViewById(R.id.listitem);

// 设置item中的indexText的文本

indexText.setText(items.get(position).toString());

indexText.setTextColor(Color.GRAY);


// 获取当前时间

Time t = new Time();

t.setToNow();

hour = t.hour;

int minute = t.minute;


// Log.v("time",hour + "");


if (position < hour) {

convertView.setBackgroundColor(Color.LTGRAY);

}

if (position == hour) {

x = convertView.getWidth();

// 把convertView分成60等份

y = convertView.getHeight() * minute / 60;

/* Log.v("minute", minute + "");

* Log.v("width", x + "");

*Log.v("height",convertView.getHeight()

* + "");

* Log.v("Rectheight", y + "")

*/

/*MyView mv = newMyView();实例化MyView对象后,会自动调用onDraw方法

mv.onDraw(canvas);

setContentView(mv);*/


//此时convertView里面已经没有TextView了,所以要用canvas.drawText()设置文本

LinearLayout layout = new LinearLayout(mContext);

layout.addView(new MyView(mContext));

return layout;

}

return convertView;

}

这样的话在ListView 的当前时间栏中的画布已经占满了整个手机屏幕,不打算找一些方法设置一下画布的大小,后来找到了这个方法onMeasure。

在MyView中要添加另一个方法:

protectedvoidonMeasure(int widthMeasureSpec, int heightMeasureSpec){

setMeasuredDimension(1500, 60);

}

在网上查了一些资料,给出了一些解释:

1.onMeasure的两个参数用于测量水平和垂直空间大小,具体怎么测量,不得而知

2.onMeasure被调用时用来决定当前view以及所有它的子view的尺寸请求

画面终于恢复了正常,Ok!一切搞定!