1:新建一个MyScrollview继承Scrollview可实现tablayout标题置顶
public class MyScrollview extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public MyScrollview(Context context) {
super(context);
}
public MyScrollview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollview(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
}
}
public interface ScrollViewListener {
void onScrollChanged(MyScrollview scrollView, int l, int t, int oldl, int oldt);
}
}
2:新建viewpager计算页面高度
public class CustomViewPager extends ViewPager {
private int current;
private int height = 0;
/**
* 保存position与对于的View
*/
private HashMap mChildrenViews = new LinkedHashMap();
private boolean scrollble = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mChildrenViews.size() > current) {
View child = mChildrenViews.get(current);
if (child != null) {
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.WRAP_CONTENT, 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;
}
}
3:主页面布局:包含myscrollview+tablayout+viewpager
4:MainActivity中
public class Main2Activity extends AppCompatActivity {
CustomViewPager mViewPager;
List mFragments;
String[] mTitles = new String[]{
"主页", "微博", "相册"
};
private TabLayout mTabLayout;
private MyScrollview scroll;
private LinearLayout layout;
private RelativeLayout rl_layout;
private LinearLayout iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
// 第一步,初始化ViewPager和TabLayout
mViewPager = (CustomViewPager) findViewById(R.id.viewpager);
mTabLayout = (TabLayout) findViewById(R.id.tabs);
layout = (LinearLayout) findViewById(R.id.layout);
rl_layout = (RelativeLayout) findViewById(R.id.rl_layout);
scroll = (MyScrollview) findViewById(R.id.scroll);
iv = (LinearLayout) findViewById(R.id.iv);
setupViewPager();
}
private void setupViewPager() {
mFragments = new ArrayList<>();
ListFragment listFragment = new ListFragment(mViewPager, 0);
ListFragment2 listFragment2 = new ListFragment2(mViewPager, 1);
ListFragment3 listFragment3 = new ListFragment3(mViewPager, 2);
mFragments.add(listFragment);
mFragments.add(listFragment2);
mFragments.add(listFragment3);
// 第二步:为ViewPager设置适配器
BaseFragmentAdapter adapter =
new BaseFragmentAdapter(getSupportFragmentManager(), mFragments, mTitles);
mViewPager.setAdapter(adapter);
// 第三步:将ViewPager与TableLayout 绑定在一起
mTabLayout.setupWithViewPager(mViewPager);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mViewPager.resetHeight(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
scroll.setScrollViewListener(new MyScrollview.ScrollViewListener() {
@Override
public void onScrollChanged(MyScrollview scrollView, int l, int t, int oldl, int oldt) {
//计算高度置顶标题
if (t > iv.getHeight() && mTabLayout.getParent() == layout) {
layout.removeView(mTabLayout);
rl_layout.addView(mTabLayout);
} else if (t < iv.getHeight() && mTabLayout.getParent() == rl_layout) {
rl_layout.removeView(mTabLayout);
layout.addView(mTabLayout);
}
}
});
}
}
5:viewpager适配器
public class BaseFragmentAdapter extends FragmentPagerAdapter {
protected List mFragmentList;
protected String[] mTitles;
// public BaseFragmentAdapter(FragmentManager fm) {
// this(fm, null, null);
// }
public BaseFragmentAdapter(FragmentManager fm, List fragmentList, String[] mTitles) {
super(fm);
if (fragmentList == null) {
fragmentList = new ArrayList<>();
}
this.mFragmentList = fragmentList;
this.mTitles = mTitles;
}
// public void add(Fragment fragment) {
// if (isEmpty()) {
// mFragmentList = new ArrayList<>();
//
// }
// mFragmentList.add(fragment);
// }
@Override
public Fragment getItem(int position) {
// Logger.i("BaseFragmentAdapter position=" +position);
return isEmpty() ? null : mFragmentList.get(position);
}
@Override
public int getCount() {
return isEmpty() ? 0 : mFragmentList.size();
}
public boolean isEmpty() {
return mFragmentList == null;
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
/* @Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}*/
}
6:fragment三个一样写法,布局中recyclerview控件
public class ListFragment extends Fragment {
RecyclerView mRecyclerView;
private static final String KEY = "key";
private String title = "数据";
List mDatas = new ArrayList<>();
private View mView;
private Context mContext;
private ItemAdapter mAdapter;
private CustomViewPager vp;
private int fragment_ID;
public ListFragment(CustomViewPager viewPager, int fragmentID) {
vp = viewPager;
fragment_ID = fragmentID;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mView == null) {
mContext = getActivity();
mView = View.inflate(mContext, R.layout.fragment_list, null);
initView(mView);
} else {
ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null) {
parent.removeView(mView);
}
}
vp.setObjectForPosition(mView, fragment_ID);
return mView;
}
protected void initView(View view) {
Bundle arguments = getArguments();
if (arguments != null) {
title = arguments.getString(KEY);
}
mRecyclerView = view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
DividerItemDecoration itemDecoration = new DividerItemDecoration(getContext(),
LinearLayoutManager.VERTICAL);
mRecyclerView.addItemDecoration(itemDecoration);
mRecyclerView.setLayoutManager(layoutManager);
for (int i = 0; i < 20; i++) {
String s = String.format("我是第1个页面第%d条" + title, i);
mDatas.add(s);
}
mAdapter = new ItemAdapter(mContext, mDatas);
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onResume() {
super.onResume();
}
}