我们需要测量出LIstView的长度才能完全的显示ListVIew所有内容,然而很多时候每个ListVIew的Item的高度是不一样的,网上很多方法用的是对每一个Item调用measure(0,0)方法,然后height=item.getMeasureHeight()获得height,经过我的测试发现每个item的高度一样,也许是系统默认高度吧,这样的话测出的高度就不是正在的高度,也就不能完全显示所有的内容,这时候我考虑在Adapter的getView方法中进行测量,结果获得了每一个Item的准确高度。这时候要做的就是将每一个item的高度加起来,最后在设置ListView的LayoutParams。然而我们知道getView方法的调用是在手指滑动出一个新的item就调用,所以不能单纯的在getIView中将每个item的高度相加,这样会重复想加,所以我用一个HashMap来记录每个Item的position和height,因为getView方法是在用户滑动界面才调用,我们也不知道用户什么时候滑动界面,所以我用了一个线程来监测,
getView中测量代码:
[mw_shl_code=java,true]final View temp1 = convertView;
final int pos = position;
final ViewTreeObserver tree = temp1.getViewTreeObserver();
tree.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
temp1.getViewTreeObserver().removeGlobalOnLayoutListener(
this);
map.put(pos, temp1.getHeight());
Log.e("Pre Height", temp1.getHeight() + "");
}
});[/mw_shl_code]
Thread的代码:
[mw_shl_code=java,true]new Thread() {
@Override
public void run() {
while (!isBack) {是否点击back结束该Activity
int size = map.size();
int height = 0;
for (int i = 0; i < size; i++) {
height += map.get(i);
}
handler.sendEmptyMessage(height);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();[/mw_shl_code]
Handler的代码:
[mw_shl_code=java,true]final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
int h = msg.what;
ListAdapter listAdapter = commentListView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
ViewGroup.LayoutParams params = commentListView
.getLayoutParams();
params.height = h
+ (commentListView.getDividerHeight() * (listAdapter
.getCount() - 1)) + 79;
commentListView.setLayoutParams(params);
super.handleMessage(msg);
}
};[/mw_shl_code]
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。