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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值