Android之AppBarLayout實(shí)現(xiàn)懸停吸附伸縮效果

前幾天看到這樣一個(gè)UI效果,然后自己也仿照實(shí)現(xiàn)了下:

開眼app個(gè)人中心.gif

看著挺酷的,也有很多App都用到了這個(gè)UI效果,比如開眼App和滬江開心詞場(chǎng)就用到了.
所以下面就來簡(jiǎn)單實(shí)現(xiàn)一下這個(gè)UI效果吧.

組合三劍客

1.AppBarLayout
2.CoordinatorLayout
3.CollapsingToolbarLayout

實(shí)現(xiàn)上面的UI效果需要將這三劍客的組合起來用,下面先介紹下這三個(gè)控件:

AppBarLayout:

1.AppBarLayout簡(jiǎn)單介紹

AppBarLayout是android.support:design包中的支持的控件,繼承自LinearLayout,實(shí)際上就是一個(gè)垂直分布的LinearLayout.父類視圖結(jié)構(gòu)如下:

public class AppBarLayout 
extends LinearLayout

java.lang.Object 
   ?  android.view.View
      ? android.view.ViewGroup
           ?  android.widget.LinearLayout  
              ? android.support.design.widget.AppBarLayout 

其中官方文檔中有這么兩句話尤為重要:

This view depends heavily on being used as a direct child within a CoordinatorLayout. If you use AppBarLayout within a different ViewGroup, most of it's functionality will not work.

AppBarLayout also requires a separate scrolling sibling in order to know when to scroll. The binding is done through the AppBarLayout.ScrollingViewBehavior behavior class, meaning that you should set your scrolling view's behavior to be an instance of AppBarLayout.ScrollingViewBehavior.

意思就是說AppBarLayout 必須作為CoordinatorLayout的直接子類,否則很多功能是無法實(shí)現(xiàn)的.并且AppBarLayout 必須有一個(gè)能滾動(dòng)的兄第ScrollView (實(shí)現(xiàn)了NestedScrollView,listview不可以哦),以此來通知AppBarLayout 何時(shí)進(jìn)行滾動(dòng),兄弟View必須實(shí)現(xiàn)以下標(biāo)識(shí):

app:layout_behavior="@string/appbar_scrolling_view_behavior"

官方給出的例子如下:

<android.support.design.widget.CoordinatorLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

     <android.support.v4.widget.NestedScrollView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             app:layout_behavior="@string/appbar_scrolling_view_behavior">

         <!-- Your scrolling content -->

     </android.support.v4.widget.NestedScrollView>

     <android.support.design.widget.AppBarLayout
             android:layout_height="wrap_content"
             android:layout_width="match_parent">

         <android.support.v7.widget.Toolbar
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

         <android.support.design.widget.TabLayout
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

     </android.support.design.widget.AppBarLayout>

 </android.support.design.widget.CoordinatorLayout>

2.AppBarLayout的具體使用

  • AppBarLayout直接子View的幾種響應(yīng)方式

AppbarLayout 可以指定當(dāng)某個(gè)可滑動(dòng)的兄弟View滑動(dòng)手勢(shì)改變時(shí)AppbarLayout 內(nèi)部直接子View的響應(yīng)動(dòng)作,只要通過app:layout_scrollFlags屬性來指定響應(yīng)動(dòng)作,layout_scrollFlags有5種響應(yīng)動(dòng)作,下面簡(jiǎn)單介紹下:

  1. app:layout_scrollFlags="scroll"
    當(dāng)子view設(shè)置響應(yīng)動(dòng)作為app:layout_scrollFlags="scroll"時(shí),子view會(huì)隨ScrollView 的滾動(dòng)而滾動(dòng),就相當(dāng)于這時(shí)的子view變成了ScrollView 的item了,會(huì)跟隨item一起滾動(dòng).
<android.support.v7.widget.Toolbar
                   android:layout_width="match_parent"
                   android:layout_height="?attr/actionBarSize"
                   app:title="AppbarLayout"
                   app:titleTextColor="@color/white"
                   app:layout_scrollFlags="scroll"
                   >

               </android.support.v7.widget.Toolbar>
  1. app:layout_scrollFlags="scroll|enterAlways"
    當(dāng)子view設(shè)置響應(yīng)動(dòng)作為app:layout_scrollFlags="scroll|enterAlways"時(shí),當(dāng)ScrollView 向下滑動(dòng)時(shí),子View 將直接向下滑動(dòng)拧篮,而不管ScrollView 是否在滑動(dòng)词渤。
<android.support.v7.widget.Toolbar
                   android:layout_width="match_parent"
                   android:layout_height="?attr/actionBarSize"
                   app:title="AppbarLayout"
                   app:titleTextColor="@color/white"
                   app:layout_scrollFlags="scroll|enterAlways"
                   />

3.app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
當(dāng)子view設(shè)置響應(yīng)動(dòng)作為app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"時(shí),
當(dāng)ScrollView 向下滑動(dòng)的時(shí)候,子View(設(shè)置了enterAlwaysCollapsed 的子View)下滑至折疊的高度他托,當(dāng)ScrollView 到達(dá)滑動(dòng)范圍的結(jié)束值的時(shí)候掖肋,滑動(dòng)View剩下的部分開始滑動(dòng)仆葡。這個(gè)折疊的高度是通過子View的minimum height (最小高度)指定的赏参。

簡(jiǎn)單來說,就是第二種的加強(qiáng)版,當(dāng)ScrollView 向下滑動(dòng)時(shí)候,子view先露出半個(gè)頭,當(dāng)ScrollView 下滑到頂時(shí),子view的頭就全露出來了.

<android.support.v7.widget.Toolbar
                   android:layout_width="match_parent"
                   android:layout_height="200dp"
                   android:minHeight="?attr/actionBarSize"
                   app:title="AppbarLayout"
                   android:gravity="bottom"
                   android:layout_marginBottom="25dp"
                   app:titleTextColor="@color/white"
                   app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
                   />

4.app:layout_scrollFlags="scroll|exitUntilCollapsed"
當(dāng)子view設(shè)置響應(yīng)動(dòng)作為app:layout_scrollFlags="scroll|exitUntilCollapsed"時(shí),
當(dāng)ScrollView 向上滑動(dòng)時(shí),子View先響應(yīng)滑動(dòng)事件沿盅,滑動(dòng)至折疊高度把篓,也就是通過minimum height 設(shè)置的最小高度后,就固定不動(dòng)了腰涧,再把滑動(dòng)事件交給 scrollview,然后 scrollview才開始滑動(dòng)韧掩。

<android.support.v7.widget.Toolbar
                   android:layout_width="match_parent"
                   android:layout_height="200dp"
                   android:minHeight="?attr/actionBarSize"
                   app:title="AppbarLayout"
                   android:gravity="bottom"
                   app:titleTextColor="@color/white"
                   app:layout_scrollFlags="scroll|exitUntilCollapsed"
                   />
  1. app:layout_scrollFlags="scroll|snap"
    當(dāng)子view設(shè)置響應(yīng)動(dòng)作為app:layout_scrollFlags="scroll|snap"時(shí),當(dāng)ScrollView 下滑到頂部時(shí),如果子view只露出30%的話,子view就會(huì)自動(dòng)折疊回去,如果露出60%的話,就會(huì)自動(dòng)展開.

簡(jiǎn)單來說,就是具有彈性且遵守就近原則,露的小就干脆不露頭了,露的大,就全部出來了.

<android.support.v7.widget.Toolbar
                   android:layout_width="match_parent"
                   android:layout_height="200dp"
                   android:minHeight="?attr/actionBarSize"
                   app:title="AppbarLayout"
                   android:gravity="bottom"
                   app:titleTextColor="@color/white"
                   app:layout_scrollFlags="scroll|snap"
                   />

CoordinatorLayout

CoordinatorLayout 用來調(diào)節(jié)和控制子View的滾動(dòng),而這些子View 的具體響應(yīng)動(dòng)作是通過 behavior 屬性來指定的,你也可以根據(jù)需求自定義自己的behavior, 簡(jiǎn)單使用如下:,

<android.support.design.widget.CoordinatorLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

     <android.support.v4.widget.NestedScrollView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             app:layout_behavior="@string/appbar_scrolling_view_behavior" >
 <!-- 使用此屬性指定響應(yīng) -->

         <!-- Your scrolling content -->

     </android.support.v4.widget.NestedScrollView>

 </android.support.design.widget.CoordinatorLayout>

    app:layout_behavior="@string/appbar_scrolling_view_behavior" >
 <!-- 使用此屬性指定響應(yīng) -->

CollapsingToolbarLayout:

CollapsingToolbarLayout也是android.support:design包中的支持的控件,繼承自FrameLayout.主要用于實(shí)現(xiàn)ToolBar的伸縮效果,而且必須為AppBarLayout的直接子View;

繼承結(jié)構(gòu)圖如下:

 java.lang.Object 
   ? android.view.View  
     ? android.view.ViewGroup  
        ? android.widget.FrameLayout   
           ?  android.support.design.widget.CollapsingToolbarLayout 

主要使用到的方法如下:

  1. setCollapsedTitleGravity
void setCollapsedTitleGravity(int gravity)

設(shè)置折疊標(biāo)題和垂直重力的水平對(duì)齊方式窖铡,當(dāng)折疊邊界中有額外空間超出標(biāo)題本身所需的空間時(shí)疗锐,將使用該對(duì)齊方式
相關(guān)的XML屬性:

CollapsingToolbarLayout_collapsedTitleGravity

2.setExpandedTitleGravity

void setExpandedTitleGravity(int gravity)

設(shè)置展開標(biāo)題和垂直重力的水平對(duì)齊方式,當(dāng)擴(kuò)展邊界中有額外空間超出標(biāo)題本身所需的空間時(shí)费彼,將使用該對(duì)齊方式滑臊。
相關(guān)的XML屬性:

CollapsingToolbarLayout_expandedTitleGravity

3.setExpandedTitleTextColor

void setExpandedTitleTextColor(ColorStateList colors)

設(shè)置展開標(biāo)題的文本顏色。

4.setCollapsedTitleTextColor

void setCollapsedTitleTextColor(ColorStateList colors)

設(shè)置折疊標(biāo)題的文本顏色箍铲。

5.setCollapsedTitleTypeface

void setCollapsedTitleTypeface(字體字體)

設(shè)置用于折疊標(biāo)題的字體雇卷。

5.setExpandedTitleMarginBottom

void setExpandedTitleMarginBottom(int margin)

以像素為單位設(shè)置底部展開的標(biāo)題邊距。
相關(guān)的XML屬性:

CollapsingToolbarLayout_expandedTitleMarginBottom
  1. 固定Toolbar
app:layout_collapseMode="pin"

6.更多方法見文檔

關(guān)于AppBarLayout的三劍客組合就介紹的差不多了,想進(jìn)一步了解的可以去查閱官方文檔,上面都給出了連接的.

特別說明:

三劍客配合使用,可以做出一些很炫酷的UI效果.
但是前提必須滿足:AppbarLayout 要作為CoordinatorLayout 的直接子View关划,而CollapsingToolbarLayout 要作為AppbarLayout 的直接子View 小染,否則,上面展示的效果將實(shí)現(xiàn)不了.

AppbarLayout實(shí)例展示

1.仿 [開眼App]個(gè)人中心效果

  • .xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    xmlns:imagetext="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="@color/colorWhite"

    >

<android.support.design.widget.AppBarLayout
    android:id="@+id/center_appbar_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp"
    android:background="@color/colorWhite"
    android:fitsSystemWindows="true"

    >

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toobar"
        android:layout_width="match_parent"
        android:layout_height="260dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:contentScrim="@color/colorGraylight"
        fresco:expandedTitleTextAppearance="@style/style_textsize1"
        fresco:collapsedTitleTextAppearance="@style/style_textsize"
        fresco:collapsedTitleGravity="left"
       fresco:expandedTitleMarginTop="185dp"
        fresco:expandedTitleGravity="left"
        fresco:expandedTitleMarginStart="30dp"
        >
        <FrameLayout
            app:layout_scrollFlags="scroll"
            android:layout_width="match_parent"
            android:layout_height="180dp">

            <com.facebook.drawee.view.SimpleDraweeView
                android:id="@+id/avatar_max"
                android:layout_width="match_parent"
                android:layout_height="170dp" />


            <com.facebook.drawee.view.SimpleDraweeView
                android:layout_marginLeft="20dp"
                android:layout_gravity="bottom"
                android:id="@+id/avatar_min"
                android:layout_width="70dp"
                android:layout_height="70dp"
                fresco:actualImageScaleType="centerCrop"
                fresco:placeholderImageScaleType="centerCrop"
                fresco:roundedCornerRadius="50dp"
                />
        </FrameLayout>

        <FrameLayout
            android:layout_marginTop="180dp"
            app:layout_scrollFlags="scroll"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            >

            <Button
                android:id="@+id/edit_btn"
                android:layout_width="60dp"
                android:layout_height="20dp"
                android:layout_marginRight="20dp"
                android:layout_gravity="right|center_vertical"
                android:background="@drawable/login_btn"
                android:gravity="center"
                android:text="編輯資料"
                android:textColor="@color/colorBlacklight"
                android:textSize="10sp" />
        </FrameLayout>

        <TextView
           android:layout_marginTop="230dp"
            app:layout_scrollFlags="scroll"
            android:textSize="10sp"
            android:id="@+id/date"
            android:layout_marginLeft="20dp"
            android:text="2018.07.08注冊(cè)"
            android:textColor="@color/colorGraylight"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            app:layout_collapseMode="pin"
            android:layout_height="?attr/actionBarSize"
            >
        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.CollapsingToolbarLayout>







    <LinearLayout
        android:gravity="center_vertical"
        android:layout_marginTop="20dp"
        android:background="@color/colorGrayalpha"
        android:layout_width="match_parent"
        android:layout_height="70dp">

        <openeyes.dr.openeyes.widget.CustomImageTextView
            android:id="@+id/works"
            android:layout_marginLeft="40dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            imagetext:image="@drawable/works2"
            imagetext:text="@string/works"
            imagetext:textColor="@color/colorGraylight"
            >
        </openeyes.dr.openeyes.widget.CustomImageTextView>

        <openeyes.dr.openeyes.widget.CustomImageTextView
            android:id="@+id/attention"
            android:layout_marginLeft="90dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            imagetext:image="@drawable/attention6"
            imagetext:text="@string/attention"
            imagetext:textColor="@color/colorGraylight"
            >
        </openeyes.dr.openeyes.widget.CustomImageTextView>
        <openeyes.dr.openeyes.widget.CustomImageTextView
            android:id="@+id/fans"
            android:layout_marginLeft="90dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            imagetext:image="@drawable/works2"
            imagetext:text="@string/fans"
            imagetext:textColor="@color/colorGraylight"
            >
        </openeyes.dr.openeyes.widget.CustomImageTextView>
    </LinearLayout>

</android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_state"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />




</android.support.design.widget.CoordinatorLayout>
  • java文件:
/**
 * Created by darryrzhong on 2018/9/5.
 */

public class PersonPageActivity extends SwipeBackActivity {

    @BindView(R.id.avatar_max)
    SimpleDraweeView avatarBackground;
    @BindView(R.id.avatar_min)
    SimpleDraweeView avatarUser;
    @BindView(R.id.date)
    TextView registerDate;
    @BindView(R.id.works)
    CustomImageTextView works;
    @BindView(R.id.attention)
    CustomImageTextView attention;
    @BindView(R.id.fans)
    CustomImageTextView fans;
    @BindView(R.id.center_appbar_layout)
    AppBarLayout appBarLayout;
    @BindView(R.id.collapsing_toobar)
    CollapsingToolbarLayout collToobar;
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.recycle_state)
    RecyclerView recyclerView;
    private SharedPreferences sharedPreferences = MyApplication.sharedPreferences;
    private HistoryDB db;
    private List<HistoryDetails> details  = null;
    private DynamicStateRecyclerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_person_page);
        ButterKnife.bind(this);
        initView();
        initData();
    }

    private void initData() {
        db = new HistoryDB();
        details= db.loadHistoryByUserId(sharedPreferences.getString("userId","000"));
        if (details==null||details.size()==0){

        }else {
            Collections.reverse(details);
            adapter = new DynamicStateRecyclerAdapter(details,this);
            LinearLayoutManager manager = new LinearLayoutManager(this);
            manager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(manager);
            recyclerView.setAdapter(adapter);
            recyclerView.setItemAnimator(new DefaultItemAnimator());//添加默認(rèn)動(dòng)畫
            //設(shè)置RecyclerView的item監(jiān)聽事件
            setOnItemClickListener();
        }


    }

    private void setOnItemClickListener() {

        adapter.setOnItemClickListener(new DynamicStateRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View itemview, DynamicStateRecyclerAdapter.MyViewHolder childview, int position) {
                initVideoDetail( position);//初始化視頻詳情界面數(shù)據(jù)并實(shí)現(xiàn)跳轉(zhuǎn)
            }
        });
    }

    /**
     * 初始化視頻詳情界面數(shù)據(jù),跳轉(zhuǎn)至視頻詳情界面
     * */
    private void initVideoDetail(int position) {
        Intent intent = new Intent(PersonPageActivity.this, VideoDetailActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("title",details.get(position).getTitle());//獲取標(biāo)題
        bundle.putString("time", details.get(position).getDetail());
        bundle.putString("desc", details.get(position).getDesc());//視頻描述
        bundle.putString("blurred", details.get(position).getBlurred());//模糊圖片地址
        bundle.putString("feed", details.get(position).getPhoto());//圖片地址
        bundle.putString("video", details.get(position).getVideo());//視頻播放地址
        bundle.putInt("collect", details.get(position).getCollect());//收藏量
        bundle.putInt("share", details.get(position).getShare());//分享量
        bundle.putInt("reply", details.get(position).getReply());//回復(fù)數(shù)量
        intent.putExtras(bundle);
        startActivity(intent);
    }

    private void initView() {
        avatarBackground.setImageURI(Uri.parse(sharedPreferences.getString("userIcon","")));
        avatarUser.setImageURI(Uri.parse(sharedPreferences.getString("userIcon","")));
        toolbar.setTitle(sharedPreferences.getString("userName",""));//設(shè)置標(biāo)題
        collToobar.setExpandedTitleColor(getResources().getColor(R.color.colorBlack));
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        toolbar.setNavigationIcon(R.drawable.back_black);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    @OnClick(R.id.attention)
    public void onClick(){
        startActivity(new Intent(this,MyAttentionActivity.class));
    }


}

效果展示:

開眼app個(gè)人中心.gif

2.仿[開眼App]搜索懸停界面:

  • .xml布局文件:
<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <openeyes.dr.openeyes.widget.SearchEditText
            android:id="@+id/search_editext"
            android:layout_marginLeft="20dp"
            android:background="@drawable/shape_search"
            android:layout_width="300dp"
            android:layout_height="30dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:gravity="start|center_vertical"
            android:imeOptions="actionSearch"
            android:singleLine="true"
            android:hint="搜索視頻贮折、作者裤翩、用戶及標(biāo)簽"
            android:textSize="13sp"

            />

        <TextView
            android:id="@+id/cancle_main"
            android:textColor="@color/colorBlacklight"
            android:gravity="center"
            android:text="取消"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <FrameLayout
        android:id="@+id/history_fl"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        >

        <TextView
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="20dp"
            android:textSize="20sp"
            android:text="搜索歷史"
            android:textColor="@color/colorBlack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/delete_history"
            android:layout_marginRight="20dp"
            android:layout_gravity="center_vertical|right"
            android:textColor="@color/colorAniBtns"
            android:gravity="center"
            android:text="清空"
            android:textSize="13sp"
            android:layout_width="50dp"
            android:layout_height="wrap_content" />
    </FrameLayout>

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@color/colorWhite"
        >


        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorWhite"

            >
            <android.support.v7.widget.RecyclerView
                android:id="@+id/search_history_rv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll"
                >

            </android.support.v7.widget.RecyclerView>


            <TextView
                android:layout_marginLeft="20dp"
                android:text="熱搜關(guān)鍵詞"
                android:textSize="20sp"
                android:textColor="@color/colorBlack"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </android.support.design.widget.AppBarLayout>



        <android.support.v7.widget.RecyclerView
            android:id="@+id/hot_search_rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            >

        </android.support.v7.widget.RecyclerView>

    </android.support.design.widget.CoordinatorLayout>


</LinearLayout>
  • java文件:
package openeyes.dr.openeyes.view.activity;

/**
 * Created by darryrzhong on 2018/9/10.
 */

public class SearchActivity extends AppCompatActivity {

    @BindView(R.id.search_editext)
    SearchEditText searchEditText;
    @BindView(R.id.cancle_main)
    TextView cancleMain;
    @BindView(R.id.history_fl)
    FrameLayout hintLayout;
    @BindView(R.id.delete_history)
    TextView deleteHistory;
    @BindView(R.id.search_history_rv)
    RecyclerView recyclerSearch;
    @BindView(R.id.hot_search_rv)
    RecyclerView recyclerHot;
    private String [] hotKeyWord = {"美食","旅行","生活小技巧","健身","汽車","廣告","動(dòng)畫",
            "創(chuàng)意靈感","當(dāng)下亂碼","一條","日食記","視知TV"};
    private List<SearchHistory> searchHistories;
    private List<SearchHistory> hotKeyWords = new ArrayList<>();;
    private SearchRecyclerAdapter adapter;
    private SearchDB db;
    private SearchRecyclerAdapter adapter1;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        ButterKnife.bind(this);
        initData();
        setListener();
    }

    private void initData() {
        db = new SearchDB();
        hotKeyWords.clear();
        for (String keyWord:hotKeyWord){
            hotKeyWords.add(new SearchHistory(keyWord));
        }

        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayout.VERTICAL);
        recyclerHot.setLayoutManager(manager);
        adapter = new SearchRecyclerAdapter(hotKeyWords);
        recyclerHot.setAdapter(adapter);
        recyclerHot.setItemAnimator(new DefaultItemAnimator());

        searchHistories = db.loadSearchHistoryAll();
        if (searchHistories==null||searchHistories.size()==0){
            hintLayout.setVisibility(View.GONE);
            recyclerSearch.setVisibility(View.GONE);
        }else {
            hintLayout.setVisibility(View.VISIBLE);
            Collections.reverse(searchHistories);
            LinearLayoutManager manager1 = new LinearLayoutManager(this);
            manager.setOrientation(LinearLayout.VERTICAL);
            recyclerSearch.setLayoutManager(manager1);
            adapter1 = new SearchRecyclerAdapter(searchHistories);
            recyclerSearch.setAdapter(adapter1);
            recyclerSearch.setItemAnimator(new DefaultItemAnimator());//添加默認(rèn)動(dòng)畫
            adapter1.setOnItemClickListener(new SearchRecyclerAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View itemview, SearchRecyclerAdapter.MyViewHolder childview, int position) {
                    Intent intent = new Intent(SearchActivity.this,SearchResultActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("keyWord",searchHistories.get(position).getKeyWord());
                    intent.putExtras(bundle);
                    startActivity(intent);
                }
            });
        }

    }

    private void setListener() {
        searchEditText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
                if (keyCode==KeyEvent.KEYCODE_ENTER&&keyEvent.getAction()==KeyEvent.ACTION_DOWN){
                       String keyWord = searchEditText.getText().toString().trim();
                       if ("".equals(keyWord)){
                           ToastUtil.showToast(SearchActivity.this,"請(qǐng)輸入搜索內(nèi)容");
                       }else {
                           SearchHistory searchHistory = new SearchHistory(keyWord);
                           List<SearchHistory> temp = db.loadSearchByKeyWord(keyWord);
                           if (temp==null){
                               db.saveOrUpdate(searchHistory);
                           }else if (temp.size()==0){
                               db.saveOrUpdate(searchHistory);
                           }
                           Intent intent = new Intent(SearchActivity.this,SearchResultActivity.class);
                           Bundle bundle = new Bundle();
                           bundle.putString("keyWord",keyWord);
                           intent.putExtras(bundle);
                           startActivity(intent);
                       }
                }
                return false;
            }
        });

        adapter.setOnItemClickListener(new SearchRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View itemview, SearchRecyclerAdapter.MyViewHolder childview, int position) {
                Intent intent = new Intent(SearchActivity.this,SearchResultActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("keyWord",hotKeyWords.get(position).getKeyWord());
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });


    }

    @OnClick({R.id.cancle_main,R.id.delete_history,R.id.search_editext})
    public void onClick(View v){
        switch (v.getId()){
            case R.id.cancle_main:
                finish();
                break;
            case R.id.delete_history:
                try {
                    db.delTable();
                } catch (DbException e) {
                    e.printStackTrace();
                }
                initData();

                break;
            case R.id.search_editext:
                break;
        }

    }

    @Override
    protected void onResume() {
        super.onResume();
        initData();
    }
}

效果展示:

開眼app搜索記錄.gif

好了,到這里關(guān)于AppBarLayout三劍客的基本使用就介紹完了,使用三劍客能夠?qū)崿F(xiàn)許多炫酷的UI效果,感興趣的朋友可以自行自定義.

歡迎關(guān)注作者darryrzhong,更多干貨等你來拿喲.

請(qǐng)賞個(gè)小紅心!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力调榄!

更多精彩文章請(qǐng)關(guān)注

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岛都,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子振峻,更是在濱河造成了極大的恐慌臼疫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣孟,死亡現(xiàn)場(chǎng)離奇詭異烫堤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凤价,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鸽斟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人利诺,你說我怎么就攤上這事富蓄。” “怎么了慢逾?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵立倍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我侣滩,道長(zhǎng)口注,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任君珠,我火速辦了婚禮寝志,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘策添。我一直安慰自己材部,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布唯竹。 她就那樣靜靜地躺著乐导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摩窃。 梳的紋絲不亂的頭發(fā)上兽叮,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天芬骄,我揣著相機(jī)與錄音,去河邊找鬼鹦聪。 笑死账阻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泽本。 我是一名探鬼主播淘太,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼规丽!你這毒婦竟也來了蒲牧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤赌莺,失蹤者是張志新(化名)和其女友劉穎冰抢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘狭,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挎扰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巢音。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遵倦。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖官撼,靈堂內(nèi)的尸體忽然破棺而出梧躺,到底是詐尸還是另有隱情,我是刑警寧澤傲绣,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布掠哥,位于F島的核電站,受9級(jí)特大地震影響斜筐,放射性物質(zhì)發(fā)生泄漏龙致。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一顷链、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屈梁,春花似錦嗤练、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至构哺,卻和暖如春革答,著一層夾襖步出監(jiān)牢的瞬間战坤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工残拐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留途茫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓溪食,卻偏偏與公主長(zhǎng)得像囊卜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子错沃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容