解决viewpager+多个fragment+listview,listview展示内容高度不自适应出现多余空白问题

一、重写viewpager

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;

import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * Created by lenovo on 2018/3/8.
 */

public class WrapContentHeightViewPager extends ViewPager {
    private int current;
    private int height = 0;
    /**
     * 保存position与对于的View
     */
    private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();

    private boolean scrollble = true;

    public WrapContentHeightViewPager(Context context) {
        super(context);
    }

    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mChildrenViews.size() > current) {
            View child = mChildrenViews.get(current);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = child.getMeasuredHeight();
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void resetHeight(int current) {
        this.current = current;
        if (mChildrenViews.size() > current) {

            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
            } else {
                layoutParams.height = height;
            }
            setLayoutParams(layoutParams);
        }
    }

    /**
     * 保存position与对于的View
     */
    public void setObjectForPosition(View view, int position) {
        mChildrenViews.put(position, view);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (!scrollble) {
            return true;
        }
        return super.onTouchEvent(ev);
    }

    public boolean isScrollble() {
        return scrollble;
    }

    public void setScrollble(boolean scrollble) {
        this.scrollble = scrollble;
    }

}

二、在父fragment中提供一个公共的方法,给子fragment调用

/**
 *
 * 提供子fragment调用方法,解决listview高度不自适应出现多余空白
 */
public  void setChildObjectForPosition(View view,int poistion){
    mPager.setObjectForPosition(view,poistion);
}

三、在viewpager的onPageSelected()方法中重置高度

@Override
public void onPageSelected(int arg0) {
    mPager.resetHeight(arg0);
}

四、在子fragment的onCreateView()方法中调用父fragment的方法

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_report_latest,container,false);
    HomeFragment homeFragment = (HomeFragment) getParentFragment();
    homeFragment.setChildObjectForPosition(view,0);
    return view;
}

问题:注意这里如果遇到使用,不遇到可以不予理会

如果最外层是scrollview 可能出现listview只展示一条

由于listview展示问题,于是尝试自动测量listview高度动态计算去解决问题,定义自定义listview:

public class NoScrollListview extends ListView{  

    public NoScrollListview(Context context, AttributeSet attrs) {
            super(context, attrs);
    }  

    /**
     * 动态计算高度
     */
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                            MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);  

    }  

}

原文地址:https://www.cnblogs.com/wzqnxd/p/10071882.html

时间: 2024-11-09 02:46:15

解决viewpager+多个fragment+listview,listview展示内容高度不自适应出现多余空白问题的相关文章

&lt;转载&gt;如何解决子级用float浮动父级div高度不能自适应的问题

转载:http://www.kwstu.com/ArticleView/divcss_2013101582430202 解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 最外层的父级DIV不能自适应高度-不能随对象撑开没有高度 当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个是由于浮动产生原因. 如何解决父div对象自适应高度,方法有三种,接下来DIVCSS5逐一介绍. 1.首先我们先看HTML

网络请求(viewPager,Fragment,ListView)

数据接口地址:(校园内部地址,不能使用网络流量访问) 三张向导图片的接口文件: http://172.17.29.120/localuser/ljy/ndhx/pic.json 栏目导航接口文件: http://172.17.29.120/localuser/ljy/ndhx/nav.json 关于我们接口文件: http://172.17.29.120/localuser/ljy/ndhx/about.json 培训动态接口文件: http://172.17.29.120/localuser/

android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)

第三节(2):常用控件之ViewPager.日期时间相关.ListView  一.ViewPager 实例:结合PagerAdapter滑动切换图片  二.日期时间相关:AnalogClock\DigitalClock\DatePicker\TimerPicker\DatePickerDialog\TimePickerDialog 三.ListView 实例1:城市选择器 实例2:自定义列表项 百度网盘视频下载地址:http://pan.baidu.com/s/1c0ip6la android内

解决Your content must have a ListView whose id attribute is &#39;android.R.id.list&#39;

1.错误提示:Your content must have a ListView whose id attribute is 'android.R.id.list' 对于以上错误,其实可能是因为我们要实现对ListView中setOnItemClick的事件监听而去继承了LiseActivity,但是却没有ListView的标签,只要在布局文件中添加定制Layout的代码,即将ListView的id设置为“@android:id/list”或android:id="@id/android:lis

解决 viewpager fragment 切换 Fragment被销毁的问题

当我们用FragmentViewPagerAdapter和ViewPager来完成滑动切换选项卡时,效果非常不错,但是后来遇到一个问题,FragmentA切换到FragmentB,再滑到FragmentC时,FragmentA的状态数据已经不予保存了,再次滑动到FragmentB时,FragmentA的oncreateView方法会重新调用,如果有网络请求,将会是非常蛋疼,在网上找了半天,最后看到viewpager中有个这样的方法setOffscreenPageLimit,设置为2,然后再一试,

解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题。

这两天开始在改OSChina的开源android客户端,打算用Fragment来分离Main这个Activity里的功能.用Fragment嵌套ViewPager+Fragment的时候发现问题. 红色框的是主Fragment,蓝色框是主Fragment内嵌的ViewPager+Fragment. 例如当"资讯"切换到"问答"的时候,"问答"内的ViewPager+Fragment显示不符合预期,因为里面的Fragment错位了,前面几个显示的是

自定义的BaseAdapter实现LIstView的展示

使用自定义的BaseAdapter实现LIstView的展示 实现以下功能点: 1.通过自定义的BaseAdapter展示ListView: 2.动态修改.刷新ListView内容: 3.在自定义的BaseAdapter中实现ListView内容的点击和长按点击事件: 4.在BaseAdapter的getView方法中动态增加新组件: 效果图如下: xml配置文件1(list_view01.xml) <?xml version="1.0" encoding="utf-8

WPF中Listbox/ListView 横向展示/滑动内容的方法

<ListView Name="BoardListView" ScrollViewer.VerticalScrollBarVisibility="Hidden" Height="100" VerticalAlignment="Bottom"> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel/> </ItemsPan

AsyncTask异步;ListView列表展示数据

AsyncTask异步ListView列表展示数据 libs文件夹下加入jar包(导包): gson ======================================= 添加权限: 网络请求权限:INTERNET<uses-permission android:name="android.permission.INTERNET"/>网络判断权限:ACCESS_NETWORK_STATE<uses-permission android:name="