ListView嵌套ListView的一些问题

1. 概述

这篇文章主要记录下自己在项目中的一个需求,如下图所示:


ListView嵌套ListView的一些问题_第1张图片
图片.png

这个是多家店铺的每个店铺的商品的购物车界面,目前只是还没有对应店铺名称,需要下拉刷新和上拉加载更多,针对于这样的界面,自己采用的是ListView嵌套ListView的,外层的ListView有下拉刷新和上拉加载更多,内层是一个重写 onMeasure()的自定义ListView,但是遇到了2个问题:

问题1:嵌套后,外层ListView的下拉刷新失效;
问题2:内层的ListView的adapter中的 item中的button、TextView、checkbox等控件的点击事件失效;
问题3:外层的listview的 setOnItemClickListener失效;

2. 解决方案如下

1>:解决问题1:重写内层自定义的ListView的 onInterceptTouchEvent返回false,让内层的ListView不要拦截父控件ListView的下拉刷新事件;
2>:解决问题2:重写onTouchEvent返回false,表示没有消费事件,事件会以冒泡方式传递到 最上层的 view 或者 activity,如果最上边的 view 或者 activity没有处理,还是 返回 false,该事件将消失。接下来的所有事件都会被 最上层的view 的 onTouchEvent捕获,具体可参照我之前文章;
/**
 * Email: [email protected]
 * Created by Novate 2018/8/18 9:40
 * Version 1.0
 * Params:
 * Description:    内存ListView
*/

public class ChildLiistView extends ListView {

    public ChildLiistView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public ChildLiistView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public ChildLiistView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }


    /*********************** 不要拦截父控件ListView的下拉刷新事件 start *************************/
    /*@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return false;
    }

    */

    /**
     * 为了让ChildListView的adapter中的控件可以触发点击事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return false;
    }


    /**
     * 为了让外层的AutoListView可以下拉刷新
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }
    /*********************** 不要拦截父控件ListView的下拉刷新事件  end *************************/

}
3>:解决问题3:

a:在子ListView的 adapter的 item布局文件的 根布局的 LinearLayout中添加属性:

android:descendantFocusability="blocksDescendants"

b:然后在 父 ListView的布局文件中添加属性:

android:focusable="false"

即可。

可以参照这篇文章:
https://blog.csdn.net/XiaoRouniao/article/details/73369423

你可能感兴趣的:(ListView嵌套ListView的一些问题)