实现RecyclerView可隐藏头部和内容多样化
2017-08-01 本文已影响831人
wl_tao
一、实现可隐藏头部(CoordinatorLayout+AppBarLayout)
1、在gradle中添加依赖:
compile'com.android.support:design:26.0.0-alpha1' (使用CoodinatorLayout、AppBarLayout)
compile'com.android.support:support-v4:26.0.0-alpha1' (使用ViewPager)
2、案例
注意:
a、AppBarLayout必须作为CoordinatorLayout的直接子节点
b、设置AppBarLayout中需要滑动隐藏的子控件的属性 app:layout_scrollFlags (不设置则不会实现滚动隐藏)具有5种值scroll,enterAlways,enterAlwaysCollapsed,snap,exitUntilCollapsed
c、在CoordinatorLayout中要有控件为滚动控件,并设置该控件属性 app:layout_behavior="@string/appbar_scrolling_view_behavior"
(此处调用系统提供behavior,也可自己重写)
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll_channel_top"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#30469b"
android:orientation="horizontal"
app:layout_scrollFlags="scroll|snap"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:text="@string/channel_top_content"
android:layout_gravity="center"/>
</LinearLayout>
//使用TabLayout实现顶部导航栏
<android.support.design.widget.TabLayout
android:id="@+id/tl_channel_indicator"
android:layout_width="match_parent"
android:layout_height="40dp"
>
</android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/vp_channel_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
</android.support.v4.view.ViewPager>
</android.support.design.widget.CoordinatorLayout>
内容多样化(主要是RecyclerView 的Adapter)
1、创建Adapter
例如:ChannelRecyclerViewAdapter extends RecyclerView.Adapter
而不是:ChannelRecyclerViewAdapter extends RecyclerView.Adapter<ChannelRecyclerViewAdapter.ViewHolder>
2、重写getItemViewType(返回不同的ViewType值)
@Override
public int getItemViewType(int position) {
//在bean中设置flag,来判断返回的值
return mChannelContentList.get(position).getFlag();
}
//我的bean
public class ChannelContentBean {
private String mSecondTitle;
private Drawable mDrawable;
private String mContent;
private int mFlag;
}
3、重写 RecyclerView 的adapter中onCreateViewHolder(ViewGroup parent, int viewType)方法
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder viewHolder = null;
switch (viewType) {
/*
*根据不同的viewType加载不同布局
*private static final int TYPE_COMMIT = 0;
*private static final int TYPE_PAPER = 1;
*private static final int TYPE_PIC = 2;
* */
case TYPE_COMMIT:
view = mLayoutInflater.inflate(R.layout.channel_commit_item, parent, false);
viewHolder = new CommitViewHolder(view);
break;
case TYPE_PAPER:
view = mLayoutInflater.inflate(R.layout.channel_paper_item, parent, false);
viewHolder = new PaperViewHolder(view);
break;
case TYPE_PIC:
view = mLayoutInflater.inflate(R.layout.channel_text_item, parent, false);
viewHolder = new TextViewHolder(view);
break;
default:
break;
}
return viewHolder;
}
4、创建不同的ViewHolder
static class CommitViewHolder extends RecyclerView.ViewHolder {
private TextView mTvTitle;
private ImageView mIvContent;
private TextView mTvCommit;
private Button mBtnDelete;
public CommitViewHolder(View itemView) {
super(itemView);
mTvTitle = (TextView) itemView.findViewById(R.id.tv_item_title);
mIvContent = (ImageView) itemView.findViewById(R.id.iv_item_content);
mTvCommit = (TextView) itemView.findViewById(R.id.tv_item_commit);
mBtnDelete=(Button) itemView.findViewById(R.id.btn_item_delete);
}
}
static class PaperViewHolder extends RecyclerView.ViewHolder {
private TextView mTvTitle;
private ImageView mIvContent;
private Button mBtnDelete;
public PaperViewHolder(View itemView) {
super(itemView);
mTvTitle = (TextView) itemView.findViewById(R.id.tv_item_title);
mIvContent = (ImageView) itemView.findViewById(R.id.iv_item_content);
mBtnDelete=(Button) itemView.findViewById(R.id.btn_item_delete);
}
}
static class TextViewHolder extends RecyclerView.ViewHolder {
private TextView mTvTitle;
private TextView mTvCommit;
private Button mBtnDelete;
public TextViewHolder(View itemView) {
super(itemView);
mTvTitle = (TextView) itemView.findViewById(R.id.tv_item_title);
mTvCommit = (TextView) itemView.findViewById(R.id.tv_item_commit);
mBtnDelete=(Button) itemView.findViewById(R.id.btn_item_delete);
}
}
5、绑定不同ViewHoder
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CommitViewHolder && channelContentBean.getFlag() == TYPE_COMMIT) {
((CommitViewHolder) holder).mTvCommit.setText(channelContentBean.getContent());
((CommitViewHolder) holder).mIvContent.setImageDrawable(channelContentBean.getDrawable());
((CommitViewHolder) holder).mTvTitle.setText(channelContentBean.getSecondTitle());
} else if (holder instanceof PaperViewHolder && channelContentBean.getFlag() == TYPE_PAPER) {
...
} else if (holder instanceof TextViewHolder && channelContentBean.getFlag() == TYPE_PIC) {
...
}