效果图
1.MainActivity布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.CoordinatorLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <include layout="@layout/topic_content_item" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.design.widget.TabLayout android:id="@+id/top_Title_TabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" /> <View android:layout_width="match_parent" android:layout_height="1px" android:background="#EEEEEE" /> <android.support.v4.view.ViewPager android:id="@+id/tooic_content_viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.design.widget.CoordinatorLayout> </RelativeLayout>2.MainActivity代码
public class MainActivity extends FragmentActivity { private TabLayout topTitleTabLayout; private MyList lv; private ViewPager tooic_content_viewPager; public static AppBarLayout appBarLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout2); topTitleTabLayout = (TabLayout) findViewById(R.id.top_Title_TabLayout); appBarLayout = (AppBarLayout) findViewById(R.id.appBarLayout); tooic_content_viewPager = (ViewPager) findViewById(R.id.tooic_content_viewPager); setVpData(); //添加头部的参数 topTitleTabLayout.addTab(topTitleTabLayout.newTab().setText("最新"), true); topTitleTabLayout.addTab(topTitleTabLayout.newTab().setText("最热"), true); } private void setVpData() { tooic_content_viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return new MyFragment(); } @Override public int getCount() { return 1; } }); } }3.下方的Fragment的布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.liaoinstan.springview.widget.SpringView android:id="@+id/circle_fragment_topic_spring" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </com.liaoinstan.springview.widget.SpringView> </LinearLayout>4.Fragment中的代码-----------处理嵌套冲突
第一、让Fragment实现AppBarLayout.OnOffsetChangedListener接口
第二、查找布局及控件
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View vv= inflate(getActivity(),R.layout.fragment,null); recyclerView = (RecyclerView) vv.findViewById(R.id.recyclerView); circle_fragment_topic_spring = (SpringView) vv.findViewById(R.id.circle_fragment_topic_spring); circle_fragment_topic_spring.setType(SpringView.Type.FOLLOW); circle_fragment_topic_spring.setFooter(new DefaultFooter(getActivity())); circle_fragment_topic_spring.setHeader(new DefaultHeader(getActivity())); setData(); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setAdapter(new MyAdapter()); return vv; }第三、设置AppBarLayout的 垂直方向上的偏移量发生改变监听事件,此处将MainActivity中的 AppBarLayout设置为了public static
@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(MainActivity.appBarLayout!=null) MainActivity.appBarLayout.addOnOffsetChangedListener(this); }第四、重写OnOffsetChaged方法------将SpringView重新置位,当 AppBarLayout垂直方向上的偏移量发生改变时,为 触发一个回调方法定义的接口。
@Override public void onOffsetChanged(AppBarLayout appBarLayout, final int verticalOffset) { circle_fragment_topic_spring.setEnable(verticalOffset == 0); }
第五、重写setUserVisibleHint方法,解决冲突问题
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); /** * 这段代码是为了解决springview 和tabBarLayout中嵌套时上下滚动冲突 */ if (isVisibleToUser && this.getContext() != null) { MainActivity fragmentActivity = (MainActivity) getActivity(); if (fragmentActivity.appBarLayout != null) { fragmentActivity.appBarLayout.addOnOffsetChangedListener(this); } else if (isVisibleToUser && this.getContext() == null) { //viewpager中第一页加载的太早,getContext还拿不到,做个延迟 new Handler().post(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } if (MyFragment.this.getContext() != null) { // MyApplication application = (MyApplication) TopicParticularsFragment.this.getContext().getApplicationContext(); MainActivity fragmentActivity = (MainActivity) getActivity(); if (fragmentActivity.appBarLayout != null) { fragmentActivity.appBarLayout.addOnOffsetChangedListener(MyFragment.this); } } } }); } } }第六、设置模拟数据
private void setData() { list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("我是..."+i); } }第七、RecyclerView的ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder{ public final TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv_item); } }第八、 RecyclerView的Adapter
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{ @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View vv=View.inflate(getActivity(),R.layout.item,null); MyViewHolder viewHolder=new MyViewHolder(vv); return viewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv.setText(list.get(position)); } @Override public int getItemCount() { return list.size(); } }
九、RecyclerView的子条目布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:textSize="25sp" android:text="123456" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_item"/> </LinearLayout>