android关于view嵌套问题
2017-09-02 本文已影响0人
SimpleLife_9f4a
一、listview嵌套listview,recycleview嵌套recycleview
出现问题:子view无法滑动,列表展示不完全
原因及解决方案:在控件绘制出来之前要对ListView的大小进行计算,要解决将子ListView全部显示出来的问题,就是重新计算一下其大小告知系统即可
方法1、但是这个方法设置的item的Layout必须是带有onMeasure()方法的控件,否则在计算的时候会报错
/**
* 设置Listview的高度
*/
public void setListViewHeight(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter ==null) {
return;
}
int totalHeight =0;
for(inti =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);
}
方法2、自己继承ListView,重写ListView的onMeasure()方法,来自己计算ListView的高度,然后再xml中直接使用这个自定义的ListView
public class MyListView extends ListView {
public MyListView (Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView (Context context) {
super(context);}
public MyListView (Context context, AttributeSet attrs,intdefStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
方法3、不做全部显示,但是让其可以滑动看到其余数据
继承ListView,重写interceptTouchEvent使其返回false来取消父ListView对触摸事件的拦截,将触摸事件分发到子View来处理。然后在使用的时候,将其作为父ListView使用,就可以使子ListView可以滑动了
具体自定义父ListView代码:
public class ParentListView extends ListView {
public ParentListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public ParentListView(Context context, AttributeSet attrs,intdefStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ParentListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
//将 onInterceptTouchEvent的返回值设置为false,取消其对触摸事件的处理,将事件分发给子view
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
return false;
}
}