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;

}

}

上一篇下一篇

猜你喜欢

热点阅读