延引如下资料 :
将view.onmeasure(0,0)设置为0的时候表示,此时不需要考虑父控件的布局问题,直接使用getMeasuredWidth和getMeasuredHeight获取此view的自身的实际大小,可以看下面的例子:这个是在网上引用的一段代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
Utility {
public
static
void
setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if
(listAdapter ==
null
) {
// pre-condition
return
;
}
int
totalHeight =
0
;
for
(
int
i =
0
; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i,
null
, listView);
listItem.measure(
0
,
0
);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() -
1
));
listView.setLayoutParams(params);
}
}
|
下面来说说onMeasure方法:onMeasure方法是父控件在调用子控件的时候,会想子空间传递两个参数——widthMeasureSpec和heightMeasureSpec,来指明控件可以获得的大小参数,然后可以将此参数设置到view的setMeasuredDimension方法中;注意在计算父控件传递过来的--widthMeasureSpec和heightMeasureSpec参数的时候需要首先获得参数的Mode类型即AT_MOST(最大空间),EXACTLY(实际空间)和UNSPECIFIED;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@Override
protected
void
onMeasure(
int
widthMeasureSpec,
int
heightMeasureSpec) {
int
measuredHeight = measureHeight(heightMeasureSpec);
int
measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
private
int
measureHeight(
int
measureSpec) {
// Return measured widget height.
}
private
int
measureWidth(
int
measureSpec) {
// Return measured widget width. ;
}
边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:
int
specMode = MeasureSpec.getMode(measureSpec);
int
specSize = MeasureSpec.getSize(measureSpec);
|
具体使用例子:
package com.example.expanddemo;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class LogAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<LogModel> logModels;
private Context context;
public LogAdapter(Context context, List<LogModel> itemModels) {
inflater = LayoutInflater.from(context);
this.logModels = itemModels;
this.context = context;
}
@Override
public int getCount() {
return logModels.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LogModel itemModel = logModels.get(position);
ViewHolder holder = null;
View relativeView = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.lv_item, null);
holder.tVprojectTitle = (TextView) convertView.findViewById(R.id.tv_projectcontent_title);
holder.tVprojectContent = (TextView) convertView.findViewById(R.id.tv_projectcontent_content);
holder.tVprojectName = (TextView) convertView.findViewById(R.id.tv_projectname_content);
holder.tVprojectStage = (TextView) convertView.findViewById(R.id.tv_projectstage_content);
holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.timeline_item_top);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
relativeView = (RelativeLayout) convertView.findViewById(R.id.timeline_item_bottom);
relativeView.measure(0, 0);
if (itemModel.isVisiable()) {
holder.linearLayout.setBackgroundResource(R.drawable.timeline_cont_p);
holder.tVprojectTitle.setTextColor(context.getResources().getColor(R.color.white));
holder.tVprojectContent.setTextColor(context.getResources().getColor(R.color.white));
((LinearLayout.LayoutParams) relativeView.getLayoutParams()).bottomMargin = 0;
relativeView.setVisibility(View.VISIBLE);
} else {
holder.linearLayout.setBackgroundResource(R.drawable.timeline_cont);
holder.tVprojectContent.setTextColor(context.getResources().getColor(R.color.gray1));
((LinearLayout.LayoutParams) relativeView.getLayoutParams()).bottomMargin = (-1) * relativeView.getMeasuredHeight();
relativeView.setVisibility(View.GONE);
}
holder.tVprojectContent.setText(itemModel.getProjectContent());
holder.tVprojectName.setText(itemModel.getProjectName());
holder.tVprojectStage.setText(itemModel.getProjectStage());
return convertView;
}
public void refuseAdapter(List<LogModel> datas) {
this.logModels = datas;
this.notifyDataSetChanged();
}
class ViewHolder {
TextView tVprojectContent, tVprojectName, tVprojectStage, tVprojectTitle;
LinearLayout linearLayout;
}
}