RecycleView设置不同的条目(加一个Header)

毕业设计仿照饿了么做,首页如图,刚开始是gridview加recycleview的布局,但是这样滑动的时候,GridView会一直存在页面,本来想用scrollview包裹,最后选择了将Gridview作为recycleview的

一个头条目。

即在recycleview适配器中写两个ViewHolder继承RecyclerView.ViewHolder,一个为头条目Gridview服务,一个为下面展示列表服务,如下是两个holder

class MyViewHolder extends RecyclerView.ViewHolder {

        ImageView iv_seller_icon;
        TextView tv_seller_name;
        TextView tv_seller_score;
        View mLayoutParent;

        public MyViewHolder(View itemView) {
            super(itemView);
            iv_seller_icon = (ImageView) itemView.findViewById(R.id.iv_seller_icon);
            tv_seller_name = (TextView) itemView.findViewById(R.id.tv_seller_name);
            tv_seller_score = (TextView) itemView.findViewById(R.id.tv_seller_score);
            mLayoutParent = itemView.findViewById(R.id.mLayoutParent);
        }
}

 class HeaderViewHolder extends RecyclerView.ViewHolder {

        GridView gv_food;

        public HeaderViewHolder(View itemView) {
            super(itemView);
            gv_food = (GridView) itemView.findViewById(R.id.gv_food);
        }
}

且在适配器中重写了getItemViewType方法,

@Override
    public int getItemViewType(int position) {
        return mList.get(position).getType();
    }

然后是onCreateViewHolder中判断viewType,其中HOME_TYPE_HEADER为在bean中代表条目类别的字段,如果是头条目,则用含有GridView的布局文件,不是则使用商家列表的item布局文件

@Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        if (viewType == HOME_TYPE_HEADER) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_home_header, parent, false);
            return new HeaderViewHolder(view);
        } else{
            return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.recycleview_food_item, parent, false));
        }
    }

layout_home_header布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <GridView
        android:background="#fff"
        android:id="@+id/gv_food"
        android:numColumns="4"
        android:scrollbars="none"
        android:layout_width="match_parent"
        android:layout_height="170dp" />
    <View
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="#f1f1f1"/>
</LinearLayout>

recycleview_food_item布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:id="@+id/mLayoutParent"
        android:padding="10dp"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/iv_seller_icon"
            android:src="@drawable/ic_icon_seller"
            android:layout_marginLeft="10dp"
            android:layout_width="40dp"
            android:layout_height="40dp" />
        <LinearLayout
            android:layout_marginLeft="20dp"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/tv_seller_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="商家名称"
                android:textSize="18sp"
                android:textColor="#000"/>
            <TextView
                android:id="@+id/tv_seller_score"
                android:layout_marginTop="2dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="12sp"
                android:textColor="#000"
                android:text="评分: ###"
                />
        </LinearLayout>
    </LinearLayout>
    <View
        android:layout_marginLeft="20dp"
        android:layout_width="match_parent"
        android:layout_height="0.8dp"
        android:background="#f1f1f1"/>

</LinearLayout>

在onBindViewHolder中则用instanceof对传进来的viewHolder进行判断

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof MyViewHolder) {
            ((MyViewHolder)holder).iv_seller_icon.setImageResource(mList.get(position).getIconId());
            ((MyViewHolder)holder).tv_seller_name.setText(mList.get(position).getName());
            ((MyViewHolder)holder).tv_seller_score.setText("评分: " + mList.get(position).getScore());
            ((MyViewHolder)holder).mLayoutParent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mItemClickListener != null){
                        mItemClickListener.onItemClick(mList.get(position).getName());
                    }
                }
            });


        }else{
            ((HeaderViewHolder)holder).gv_food.setAdapter(new FoodGridViewAdapter(mContext, mDrawableIds, mTitleStr));
            ((HeaderViewHolder)holder).gv_food.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    switch (position) {
                        case 0:
                            ShowResultActivity.showClass((Activity) mContext, 0);
                            break;
                    }
                }
            });
        }
    }

若传进来的ViewHolder是展示数据的MyViewHolder,则从传进来的列表中取出值设置给相应的控件,若是Gridview的HeaderViewHolder,则对其进行设置适配器的操作,从而达到将Gridview作为recycleview的第一个条目展示出来,也就解决了想要让首页滑动时Gridview跟着划上去的效果。

 

posted @ 2017-03-08 19:41  TigerTai  阅读(1441)  评论(0)    收藏  举报