CoordinatorLayout + AppBarLayout 的简单使用及解决滑动抖动问题

Stella981
• 阅读 630

第一步: 导入相应的design包

1 dependencies {
2    ......
3     implementation 'com.android.support:design:27.1.0'
4 }

第二步:布局文件

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     xmlns:app="http://schemas.android.com/apk/res-auto"
 6     android:background="#EFF3F7"
 7     tools:context=".MainActivity"
 8     android:orientation="vertical">
 9 
10     <android.support.design.widget.CoordinatorLayout
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content">
13 
14         <android.support.design.widget.AppBarLayout
15             android:layout_width="match_parent"
16             android:layout_height="200dp"
17             app:layout_behavior="com.sun.testpopu.FixAppBarLayout"
18             app:elevation="0dp">
19 
20             <View
21                 android:layout_width="match_parent"
22                 android:layout_height="200dp"
23                 android:background="#000000"
24                 app:layout_scrollFlags="scroll|enterAlwaysCollapsed"/>
25         </android.support.design.widget.AppBarLayout>
26         <android.support.v7.widget.RecyclerView
27             android:layout_width="match_parent"
28             android:layout_height="1000dp"
29             app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
30     </android.support.design.widget.CoordinatorLayout>
31 </LinearLayout>

第二步:初始化 Recyclerview

 1 /**
 2  * @author Sigal
 3  * on 2018/10/28
 4  * note:
 5  */
 6 public class MainActivity extends AppCompatActivity {
 7     private RecyclerView recyclerView;
 8     private ArrayList<String> mDataList;
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14         initData();
15         initRecycView();
16     }
17 
18     private void initRecycView() {
19         recyclerView = findViewById(R.id.recyclerview);
20         recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,
21                 LinearLayoutManager.VERTICAL, false));
22         recyclerView.setAdapter(new TextviewAdapter());
23 
24     }
25 
26     private void initData() {
27         mDataList = new ArrayList<>();
28         for (int i = 0; i < 26; i++) {
29             mDataList.add("测试数据" + i);
30         }
31     }
32 
33     public class TextviewAdapter extends RecyclerView.Adapter<TextviewAdapter.ViewHolder>{
34 
35         @NonNull
36         @Override
37         public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
38             View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false);
39             return new ViewHolder(view);
40         }
41 
42         @Override
43         public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
44             holder.mText.setText(mDataList.get(position));
45         }
46 
47         @Override
48         public int getItemCount() {
49             return mDataList.size();
50         }
51 
52         class ViewHolder extends RecyclerView.ViewHolder{
53             private final TextView mText;
54 
55             public ViewHolder(View itemView) {
56                 super(itemView);
57                 mText = itemView.findViewById(R.id.textview);
58             }
59         }
60     }
61 }

第三步:解决滑动抖动问题

 1 /**
 2  * @author Sigal
 3  * on 2018/11/26
 4  * note: 解决AppBarLayout滑动时抖动问题
 5  */
 6 public class FixAppBarLayout extends AppBarLayout.Behavior {
 7     private static final String TAG = "AppBarLayoutBehavior";
 8 
 9     public FixAppBarLayout() {
10         super();
11     }
12 
13     public FixAppBarLayout(Context context, AttributeSet attrs) {
14         super(context, attrs);
15     }
16 
17     @Override
18     public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
19         if (ev.getAction() == ACTION_DOWN) {
20             Object scroller = getSuperSuperField(this, "mScroller");
21             if (scroller != null && scroller instanceof OverScroller) {
22                 OverScroller overScroller = (OverScroller) scroller;
23                 overScroller.abortAnimation();
24             }
25         }
26 
27         return super.onInterceptTouchEvent(parent, child, ev);
28     }
29 
30     private Object getSuperSuperField(Object paramClass, String paramString) {
31         Field field = null;
32         Object object = null;
33         try {
34             field = paramClass.getClass().getSuperclass().getSuperclass().getDeclaredField(paramString);
35             field.setAccessible(true);
36             object = field.get(paramClass);
37         } catch (Exception e) {
38             e.printStackTrace();
39         }
40         return object;
41     }
42 }

注:在布局文件中引用:app:layout_behavior="com.sun.testpopu.FixAppBarLayout"

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这