RecycleView实现footer功能

来源:互联网 发布:英雄联盟mac有国服? 编辑:程序博客网 时间:2024/06/05 06:12

其实和Header是差不多的,只是这里在计算item数的时候要加上footer这个item,具体代码如下。

准备两个xml,一个用于普通的Item,一个用于底部footer的item。

list_item_add_footer.xml

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:card_view="http://schemas.android.com/tools"    android:layout_width="80dp"    android:layout_height="wrap_content"    android:layout_margin="10dp"    android:orientation="vertical"    android:padding="2dp"    card_view:cardPreventCornerOverlap="true"    app:cardCornerRadius="8dp">    <TextView        android:id="@+id/tv_add"        android:padding="5dp"        android:gravity="center"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="+添加"        android:textColor="#244fff"/></android.support.v7.widget.CardView>

list_item_section_show.xml

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:card_view="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="10dp"    android:orientation="vertical"    android:padding="2dp"    card_view:cardPreventCornerOverlap="true"    app:cardCornerRadius="8dp">    <LinearLayout        android:background="@drawable/cardview_backgroud"        android:id="@+id/layout_item"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal"        android:gravity="center">        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            android:paddingBottom="10dp"            android:paddingLeft="10dp"            android:paddingTop="10dp">            <TextView                android:id="@+id/tv_class_section"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_toRightOf="@+id/tv_section"                android:text="XXX"                android:singleLine="true"                android:ellipsize="end"                android:textColor="@color/word_color_666666"                android:textSize="@dimen/two_level_word"/>        </LinearLayout>        <TextView            android:id="@+id/tv_delete"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:layout_marginLeft="10dp"            android:layout_marginRight="10dp"            android:background="@drawable/newly_increased"/>    </LinearLayout></android.support.v7.widget.CardView>

接下来最重要的部分是Adapter了,就是在这个地方实现添加Footer

public class DetailItemSelectAdapter extends RecyclerView.Adapter{    private List<Object> infoBeen = new ArrayList<>();    private Context context;    private int ITEM_VIEW_TYPE_FOOTER = 0;  //Footer标识    private static final int ITEM_VIEW_TYPE_ITEM = 1;    private static View footer;    private int WITCH_BEAN = 0;    public static final int COURSE_BEAN = 0;    public static final int SESSION_BEAN = 1;    public static final int TEACHER_BEAN = 2;    public DetailItemSelectAdapter(Context mContext,View mFooter,List<Object> mInfoBean, int WITCH){        context = mContext;        if(mFooter != null){            footer = mFooter;        }        WITCH_BEAN = WITCH;        infoBeen = mInfoBean;        ITEM_VIEW_TYPE_FOOTER = infoBeen.size();  //footer最开始定为最后条目    }    public boolean isFooter(int position) {        return position == infoBeen.size();  //是否是Footer    }    @Override    public int getItemViewType(int position) {        return isFooter(position) ? ITEM_VIEW_TYPE_FOOTER : ITEM_VIEW_TYPE_ITEM;    }    @Override    public DisplayHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == ITEM_VIEW_TYPE_FOOTER) {            return new DisplayHolder(footer);  //传入footer        }        return DisplayHolder.newHolder(parent, context);  //传入条目    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if(isFooter(position)){            DisplayHolder lHolder = (DisplayHolder) holder;            lHolder.addTv.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    ToastUtils.showShortToast(context,"click add button");                }            });            return;        }        DisplayHolder lHolder = (DisplayHolder) holder;        DetailItemShowBean.SectionInfoBean sectionInfoBean = (DetailItemShowBean.SectionInfoBean) infoBeen.get(position);        lHolder.classSectionTv.setText(sectionInfoBean.getSectionName());        lHolder.deleteTv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                notifyItemRemoved(position);                infoBeen.remove(position);                notifyDataSetChanged();            }        });    }    @Override    public int getItemCount() {        return infoBeen.size()+1;  //有footer所以要+1    }    private static class DisplayHolder extends RecyclerView.ViewHolder {        TextView deleteTv;        TextView classSectionTv;        TextView addTv;        public DisplayHolder(View itemView) {            super(itemView);            deleteTv = (TextView) itemView.findViewById(R.id.tv_delete);            classSectionTv = (TextView) itemView.findViewById(R.id.tv_class_section);            addTv = (TextView) itemView.findViewById(R.id.tv_add);        }        private static DisplayHolder newHolder(ViewGroup parent, Context context) {            View view = LayoutInflater.from(context).inflate(R.layout.list_item_section_show, parent, false);            return new DisplayHolder(view);        }    }}

可以看到最开始要传入的有Context、list、View和一个自定义的显示参数,最后就是在Activity中使用,使用方法如下:

sectionRecyclerView = (RecyclerView)findViewById(R.id.rv_section);        sectionRecyclerView.setLayoutManager(new LinearLayoutManager(this));        List<Object> list  =new  ArrayList<>();        for(int i =0;i<10;i++){            DetailItemShowBean.SectionInfoBean s = new DetailItemShowBean.SectionInfoBean();            s.setSectionName("第"+(i+1)+"节");            Object object = s;            list.add(object);        }        View footer = LayoutInflater.from(this).inflate(R.layout.list_item_add_footer,sectionRecyclerView,false);        DetailItemSelectAdapter detailItemSelectAdapter = new DetailItemSelectAdapter(this,footer,list,0);        sectionRecyclerView.setAdapter(detailItemSelectAdapter);

最终的效果是普通的item是文字并可以删除,footer为一个添加的操作。

最后说一下,如果想要Footer独占一行,可以参考这篇文章:http://blog.csdn.net/lsw8569013/article/details/53667754

0 0
原创粉丝点击