美文网首页Android
实现RecyclerView可隐藏头部和内容多样化

实现RecyclerView可隐藏头部和内容多样化

作者: wl_tao | 来源:发表于2017-08-01 01:14 被阅读831次

一、实现可隐藏头部(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) {
      ...

}

相关文章

网友评论

    本文标题:实现RecyclerView可隐藏头部和内容多样化

    本文链接:https://www.haomeiwen.com/subject/zfpdlxtx.html