最近在做一个仿海词词典的demo,首页主要用到了CoordinatorLayout 折叠标题,并加载下方不同布局的数据。海词词典的的首页是非常漂亮的,先让我们看下它的首页吧。直接上图片
这里我们可以看到,首页向上滑动的过程中,只有上部分滑出了屏幕,而搜索框并没有,而是滑到了屏幕的上方看上去非常漂亮
在下边的listview中,装载了不同布局的item(可以看到第一部分和第二部分的布局是不同的),那这是怎么实现的呢?具体我不清楚人家是用的什么方法,但是我使用了
CoordinatorLayout 的折叠标题功能实现了上滑折叠功能,然后下边是用了
RecyclerView嵌套了不同布局的item,刚开始做的时候我没有使用RecyclerView而是直接用的ListView嵌套不同布局的item,但是做成后没有折叠效果,查了网上的资料后发现在RecyclerView中的layout_behavior是对折叠效果支持的,具体用listview怎么实现,能否实现?小弟bu知,望大神指点!
下边看下我做的demo吧
1、CoordinatorLayout
先看下我的整个布局文件activity_mainsearch.xml
- <?xml version="1.0" encoding="utf-8"?>
- <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:fitsSystemWindows="true">
-
- <android.support.design.widget.AppBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fitsSystemWindows="true"
- android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
-
- <android.support.design.widget.CollapsingToolbarLayout
- android:id="@+id/collapse_toolbar"
- android:layout_width="match_parent"
- android:layout_height="180dp"
- android:fitsSystemWindows="true"
- app:contentScrim="?attr/colorPrimary"
- app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
- <ImageView
- android:id="@+id/header"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/photo"
- android:fitsSystemWindows="true"
- android:scaleType="centerCrop"
- app:layout_collapseMode="parallax" />
-
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:gravity="top"
- android:minHeight="?attr/actionBarSize"
- app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
- app:titleMarginTop="0dp" >
- <TextView
- android:id="@+id/toolbar_title"
- android:text="海工词典"
- style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"/>
-
- </android.support.v7.widget.Toolbar>
-
-
- <EditText
- android:id="@+id/et_search"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- app:tabIndicatorColor="@color/colorAccent"
- android:padding="5dip"
- android:layout_marginLeft="10dp"
- android:layout_marginRight="10dp"
- android:layout_marginBottom="5dp"
- android:background="@drawable/bg_edittext"
- android:textColorHint="#AAAAAA"
- android:textSize="15dip"
- android:singleLine="true"
- android:hint="请输入要查询的单词..."/>
-
-
- </android.support.design.widget.CollapsingToolbarLayout>
-
- </android.support.design.widget.AppBarLayout>
- <android.support.v7.widget.RecyclerView
- android:id="@+id/rv_mainsearch"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layout_behavior="@string/appbar_scrolling_view_behavior" />
-
-
- </android.support.design.widget.CoordinatorLayout>
CoordinatorLayout 我在这里嵌套了:AppBarLayout 、CollapsingToolbarLayout 和 RecyclerView,其中CollapsingToolbarLayout
中又包含了上部显示的图片ImageView 、标题Toolbar 和 搜索框EditText,在Toolbar 中可以设置
app:layout_collapseMode="pin"
属性来决定当上滑的时候标题是否隐藏,这里添加一点当我们加载出Toolbar后会发现上边有个向左的按钮,如果我们不想要的话可以在Acticity中设置
,(代码片段,完整代码请稍候...)
- private void setupToolbar() {
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- getSupportActionBar().setTitle("TabbedCoordinatorLayout");
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- }
CollapsingToolbarLayout具体可以参考这位大神的讲解,我这边没有用到那么多属性:
或者参考官方文档:
代码实现:SearchActivity
- package com.dictionary.activity;
-
- import android.os.Bundle;
- import android.support.design.widget.CollapsingToolbarLayout;
- import android.support.v7.app.AppCompatActivity;
- import android.support.v7.widget.LinearLayoutManager;
- import android.support.v7.widget.RecyclerView;
- import android.support.v7.widget.Toolbar;
-
- import com.dictionary.adapter.RecyclerAdapter;
- import com.dictionary.entity.News;
- import com.example.dictionary.R;
-
- import java.util.ArrayList;
- import java.util.List;
-
-
- public class SearchActivity extends AppCompatActivity {
-
- private RecyclerView recyclerview;
- private RecyclerAdapter adapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.acty_mainsearch);
-
- setupToolbar();
-
- setupCollapsingToolbar();
-
- }
-
- private void setupCollapsingToolbar() {
- final CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(
- R.id.collapse_toolbar);
- collapsingToolbar.setTitleEnabled(false);
- }
-
-
- private void setupToolbar() {
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- getSupportActionBar().setTitle("");
- }
-
- }
不过要在build.guild文件中添加依赖包,到这里就已经实现了上滑折叠的效果,其实很简单,可见这个控件的强大之处
- dependencies {
- compile fileTree(dir: 'libs', include: '*.jar')
- compile 'com.android.support:appcompat-v7:23.0.1'
- compile 'com.android.support:design:23.0.1'
- compile 'com.android.support:recyclerview-v7:23.0.1'
- compile 'com.android.support:cardview-v7:23.0.1'
- compile 'com.android.support:recyclerview-v7:23.1.1'
-
- }
2、RecyclerView
通过使用RecyclerView控件,我们可以在APP中创建带有Material Design风格的复杂列表。RecyclerView控件和ListView的原理有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加高级并且更加灵活。当我们的数据因为用户事件或者网络事件发生改变的时候也能很好的进行显示。和ListView不同的是,RecyclerView不用在负责Item的显示相关的功能,在这边所有有关布局,绘制,数据绑定等都被分拆成不同的类进行管理。具体有关
RecyclerView的讲解可以参考:
讲得非常详细,我参考了一些,再次感谢。现在我想说下加载不同布局的实现方法。RecyclerView的布局文件上边已经给出了,在此不再赘述,加载不同布局我们要重写RecyclerAdapter适配器,在这里我写了一个News的实体类来记录每个布局需要显示的信息,而通过这个实体类中的Type_View值来确定需要加载哪个布局文件:(那三个不同的item布局我就不贴了)
RecyclerAdapter:
- package com.dictionary.adapter;
-
- import android.content.Context;
- import android.support.v7.widget.RecyclerView;
- import android.support.v7.widget.RecyclerView.ViewHolder;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.TextView;
- import com.dictionary.entity.News;
- import com.example.dictionary.R;
- import java.util.ArrayList;
- import java.util.List;
-
- public class RecyclerAdapter extends RecyclerView.Adapter<ViewHolder> {
-
- public final static int TYPE_ONE = 1;
- public final static int TYPE_TWO = 2;
- public final static int TYPE_THREE = 3;
- private Context mContext;
- private List<News> newses = new ArrayList<>();
- private OnItemClickListener onItemClickListener;
-
- public RecyclerAdapter(List<News> newses,Context context) {
- super();
- this.mContext = context;
- this.newses = newses;
- }
-
- public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
- this.onItemClickListener = onItemClickListener;
- }
-
-
- public interface OnItemClickListener {
- void OnItemClick(View view, int position);
-
- void OnItemLongClick(View view, int position);
- }
-
- public void add(News news) {
- this.newses.add(news);
- notifyDataSetChanged();
- }
-
- @Override
- public int getItemViewType(int position) {
- return newses.get(position).getItemType();
-
- }
-
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = null;
- ViewHolder holder = null;
- switch (viewType) {
- case TYPE_ONE:
- view = LayoutInflater.from(mContext).inflate(R.layout.list_item1_mainsearch, parent, false);
- holder = new ViewHolderOne(view);
- break;
- case TYPE_TWO:
- view = LayoutInflater.from(mContext).inflate(R.layout.list_item2_mainsearch, parent, false);
- holder = new ViewHolderTwo(view);
- break;
- case TYPE_THREE:
- view = LayoutInflater.from(mContext).inflate(R.layout.list_item3_mainsearch, parent, false);
- holder = new ViewHolderThree(view);
- break;
- }
- return holder;
- }
-
- @Override
- public void onBindViewHolder(final ViewHolder holder, int position) {
- switch (getItemViewType(position)) {
- case TYPE_ONE:
- final ViewHolderOne holderOne = (ViewHolderOne) holder;
- onItemEventClick(holderOne);
- break;
- case TYPE_TWO:
- ViewHolderTwo holderTwo = (ViewHolderTwo) holder;
- onItemEventClick(holderTwo);
- break;
- case TYPE_THREE:
- ViewHolderThree holderThree = (ViewHolderThree) holder;
- onItemEventClick(holderThree);
- }
- }
-
- @Override
- public int getItemCount() {
- return newses.size();
- }
-
- class ViewHolderOne extends ViewHolder {
- TextView tv_item1;
- public ViewHolderOne(View itemView) {
- super(itemView);
- tv_item1 = (TextView) itemView.findViewById(R.id.tv_item1);
- tv_item1.setText("我是修改过得文本1");
- }
- }
-
- class ViewHolderTwo extends ViewHolder {
- Button bt_item1;
-
- public ViewHolderTwo(View itemView) {
- super(itemView);
- bt_item1 = (Button) itemView.findViewById(R.id.bt_item1);
- }
- }
-
- class ViewHolderThree extends ViewHolder {
- TextView textView;
- public ViewHolderThree(View itemView) {
- super(itemView);
- textView = (TextView) itemView.findViewById(R.id.tv_content1);
- textView.setText("我是修改过得图片1");
- }
- }
-
- protected void onItemEventClick(ViewHolder holder) {
- final int position = holder.getLayoutPosition();
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onItemClickListener.OnItemClick(v, position);
- }
- });
- holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- onItemClickListener.OnItemLongClick(v, position);
- return true;
- }
- });
- }
- }
News:
- package com.dictionary.entity;
-
- public class News {
-
- private String text;
- private String image;
- private String button;
- private int itemType;
- public String getText() {
- return text;
- }
- public void setText(String text) {
- this.text = text;
- }
- public String getImage() {
- return image;
- }
- public void setImage(String image) {
- this.image = image;
- }
-
- public String getButton() {
- return button;
- }
- public void setButton(String button) {
- this.button = button;
- }
- public int getItemType() {
- return itemType;
- }
- public void setItemType(int itemType) {
- this.itemType = itemType;
- }
- public News(String text, int itemType, String button, String image) {
- this.text = text;
- this.itemType = itemType;
- this.button = button;
- this.image = image;
- }
- }
Activity中的实现:(只需要在最上面那个代码片段中添加以下片段就可以)
- recyclerview = (RecyclerView) findViewById(R.id.rv_mainsearch);
- recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
-
- List<News> myDataset = new ArrayList<News>();
- myDataset.add(new News("111",1,"bbb","III"));
- myDataset.add(new News("222",2,"bbb","III"));
- myDataset.add(new News("333",3,"bbb","III"));
-
- adapter = new RecyclerAdapter(myDataset,SearchActivity.this);
- recyclerview.setAdapter(adapter);