ScrollView+TabLayout+Viewpager+Fragment+ListView+Viewpager(自适应高度)

1 自定义ScrollView 

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

import com.dyjt.dyjtgcs.interfaces.ScrollViewListener;


public class ObservableScrollView extends ScrollView {
    private ScrollViewListener scrollViewListener = null;

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

    public ObservableScrollView(Context context, AttributeSet attrs,
                                int defStyle) {
        super(context, attrs, defStyle);
    }

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

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged( x, y, oldx, oldy);
        }
    }

}

2 自定义Viewpager

因为ViewPager中的fragment在添加listview的时候会以最高的为准  剩下的其他fragment会产生大量空白 所以需要viewpager自适应高度 并在activity中调用 resetHeight()方法

/**
 * 解决嵌套viewpager时事件冲突的问题
 * Created by shenshilei on 2017/5/10.
 */
public class PersonalViewpager extends ViewPager {

    private int current;
    private int viewHeight = 0;

    private boolean scrollble = true;

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        View childView = getChildAt(getCurrentItem());
        if (childView != null)  //有可能没有子view
        {
            childView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            viewHeight = childView.getMeasuredHeight();   //得到父元素对自身设定的高
            // UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小
            //EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
            //AT_MOST(至多),子元素至多达到指定大小的值。
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void resetHeight(int current) {
        this.current = current;
        if (getChildCount() > current) {
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, viewHeight);
            } else {
                layoutParams.height = viewHeight;
            }
            setLayoutParams(layoutParams);
        }
    }

    @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;
    }

3自定义Listview


public class MylistView extends ListView {

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

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


    }

4 使用时的xml布局

ScrollView+TabLayout+Viewpager+Fragment+ListView+Viewpager(自适应高度)_第1张图片




    
        

            

                
                    
                    
                    
                





            
            

                

                    

                    


                


            

        
    


    

        

            

                

                

            
        
        
            

                

                

            

        
    


5 activity


public class Fragment_Shequ extends BaseFragment {

    @BindView(R.id.tabLayout)
    TabLayout tabLayout;
    @BindView(R.id.viewPager)
    PersonalViewpager viewPager;
    Unbinder unbinder;
    @BindView(R.id.top_change_layout_text1)
    TextView topChangeLayoutText1;
    @BindView(R.id.top_change_layout_view1)
    TextView topChangeLayoutView1;
    @BindView(R.id.top_change_layout_text2)
    TextView topChangeLayoutText2;
    @BindView(R.id.top_change_layout_view2)
    TextView topChangeLayoutView2;
    private View view;
    @BindView(R.id.scrollview)
    ObservableScrollView scrollview;
    @BindView(R.id.top_layout)
    RelativeLayout top_layout;
    TextView tc;

    @BindView(R.id.top_change_layout)
    LinearLayout top_change_layout;



    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = View.inflate(getActivity(), R.layout.fragment_2, null);
        }
        unbinder = ButterKnife.bind(this, view);
        initView();
        return view;
    }

    private void initView() {
        List sd = new ArrayList<>();
        sd.add("案例分享");
        sd.add("学习考核");


        // 添加多个tab
        for (int i = 0; i < sd.size(); i++) {
            TabLayout.Tab tab = tabLayout.newTab();
            tab.setText(sd.get(i));
            // tab.setIcon(R.mipmap.ic_launcher);//icon会显示在文字上面
            tabLayout.addTab(tab);
        }

        MyViewPagerAdapter adapter = new MyViewPagerAdapter(sd, getChildFragmentManager());
        viewPager.setAdapter(adapter);

        tabLayout.setupWithViewPager(viewPager);

        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                setIndicator(tabLayout, 50, 50);
            }
        });

        scrollview.setScrollViewListener(new ScrollViewListener() {
            @Override
            public void onScrollChanged(int x, int y, int oldx, int oldy) {


                if (y > top_layout.getHeight()) {
                    top_change_layout.setVisibility(View.VISIBLE);
                } else {
                    top_change_layout.setVisibility(View.GONE);
                }

            }
        });


        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //选中了tab的逻辑
                Log.i("info","----"+tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //未选中tab的逻辑
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //再次选中tab的逻辑
            }
        });




        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                viewPager.resetHeight(position);
                switch (position) {
                    case 0:
                        topChangeLayoutText1.setTextColor(getActivity().getResources().getColor(R.color._color_333));
                        topChangeLayoutView1.setVisibility(View.VISIBLE);
                        topChangeLayoutText2.setTextColor(getActivity().getResources().getColor(R.color._color_666));
                        topChangeLayoutView2.setVisibility(View.GONE);
                        break;
                    case 1:
                        topChangeLayoutText1.setTextColor(getActivity().getResources().getColor(R.color._color_666));
                        topChangeLayoutView1.setVisibility(View.GONE);
                        topChangeLayoutText2.setTextColor(getActivity().getResources().getColor(R.color._color_333));
                        topChangeLayoutView2.setVisibility(View.VISIBLE);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        viewPager.resetHeight(0);
    }

    @OnClick({R.id.top_change_layout_left, R.id.top_change_layout_right})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.top_change_layout_left:
                viewPager.setCurrentItem(0);
                break;
            case R.id.top_change_layout_right:
                viewPager.setCurrentItem(1);
                break;
        }
    }

    class MyViewPagerAdapter extends FragmentStatePagerAdapter {
        Fragment fragment;
        private List list;

        @Override
        public Parcelable saveState() {
            return null;
        }

        public MyViewPagerAdapter(List list, FragmentManager fm) {
            super(fm);
            this.list = list;
        }

        @Override
        public Fragment getItem(int i) {
            if (i==0){
                fragment = new ShequZiFragment();
            }else{
                fragment = new ShequZiXxFragment();
            }
            Bundle bundle = new Bundle();
            bundle.putInt("pageNum", i);
            fragment.setArguments(bundle);
            return fragment;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return list.get(position);
        }
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }

    //设置tablayout 底部下划线的宽
    public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
        try {
            Class tabLayout = tabs.getClass();
            Field tabStrip = null;
            try {
                tabStrip = tabLayout.getDeclaredField("slidingTabIndicator");
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }

            tabStrip.setAccessible(true);
            LinearLayout llTab = null;
            try {
                llTab = (LinearLayout) tabStrip.get(tabs);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
            int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

            for (int i = 0; i < llTab.getChildCount(); i++) {
                View child = llTab.getChildAt(i);
                child.setPadding(0, 0, 0, 0);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
                params.leftMargin = left;
                params.rightMargin = right;
                child.setLayoutParams(params);
                child.invalidate();
            }
        } catch (Exception e) {

        }
    }

 

你可能感兴趣的:(andriod)