scrollview嵌套listiview(解决高度问题以及两者滚动冲突问题)不用重写listview

package com.bwie.scrollview_lv_ori;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ScrollView;

public class MainActivity extends Activity {

    private ListView lv;
    private ScrollView sc;
    private String[] name = new String[] { "A", "S", "D", "F", "G", "H", "J","A1", "S1", "D1", "F1", "G1", "H1", "J1","A2", "S2", "D2", "F3", "G4", "H5", "J6",
            "H", "J", "K" };
    private boolean isLoad=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 找控件
        lv = (ListView) findViewById(R.id.lv);
        sc = (ScrollView) findViewById(R.id.sc);

        // 为lv设置适配器
        lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_expandable_list_item_1, name));

        // 重新定义listiview的高度
        setListViewHeightBasedOnChildren(lv);

        //为listview设置触摸事件
        lv.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                //请求父亲不要拦截
                if(event.getAction() == 2)
                {
                    sc.requestDisallowInterceptTouchEvent(true);
                }else{
                    sc.requestDisallowInterceptTouchEvent(false);
                }

                return false;
            }
        });

        lv.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if((scrollState == SCROLL_STATE_TOUCH_SCROLL) && isLoad)
                {
                    //滑到最低端时,就请求父亲可以拦截
                    sc.requestDisallowInterceptTouchEvent(false);
                }

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {

                //判断lv是否加载到最低端
                isLoad = (firstVisibleItem + visibleItemCount) == totalItemCount;

            }
        });

    }

    private 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 =500 /*totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1))*/;
        listView.setLayoutParams(params);
    }

}
时间: 2024-10-21 11:34:49

scrollview嵌套listiview(解决高度问题以及两者滚动冲突问题)不用重写listview的相关文章

完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题

/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the Li

ScrollView嵌套Viewpager和ListView的整合

1.ScrollView嵌套Viewpager解决滑动冲突: (1)重新ScrollView(法一) /**  * 能够兼容ViewPager的ScrollView  * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题  */ public class ScrollViewExtend extends ScrollView {     // 滑动距离及坐标     private float xDistance, yDistance, xLast, y

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)

ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法 分类: android应用开发2013-12-19 09:40 1045人阅读 评论(3) 收藏 举报 AndroidScrollView嵌套ListView显示一行高度不正确 1.前言 从谷歌那里找到的ScrollView嵌套ListView只显示一行的解决办法相信很多人都遇到过,然后大部分都是用这位博主的办法解决的吧 刚开始我也是用这个办法解决的,首先感谢这位哥的大私奉献,贴上地址 http://blog.csd

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法

本篇文章假设读者没有任何的触摸事件基础知识,所以我们会从最基本的触摸事件分发处说起. ScrollView为什么会出现嵌套EditText出现滑动事件冲突呢?相信你会有这种疑问,我们来看这么一种情况: 有一个固定高度的EditText,假设它只能显示3行文本,但是,我们在其中输入的文本多余三行时,那么这时就需要可以在EditText内部进行小幅滚动了.那么将这个EditText放入了ScrollView当中, 并且ScrollView内容过多以致ScrollView也可以滑动,这时候就会出现Ed

四种方案解决ScrollView嵌套ListView问题 [复制链接]

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

引言 在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求.例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListView信息比较多的时候也是可以滑动的,而不是固定不变的.这时,我们一般会将ScrollView和ListView嵌套在一起使用.但是这会导致ListView展示不全,然后也会有滑动冲突问题.下面我们来看看怎么解决. 解决方案 主动计算和设置ListView的高度,这样就可以合理的展示ListView的高