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跟着划上去的效果。
浙公网安备 33010602011771号