AppBarLayout之悬浮视图效果、嵌套SpringView冲突处理
效果图
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>