Android(安卓)RecyclerView多个Item布局的实现(可实现头部底部)
16lz
2022-06-18
废话不多说,小猿,上代码
package git.dzc.library;import android.support.v7.widget.RecyclerView;import android.view.ViewGroup;/** * Created by dzc on 15/10/9. */public abstract class HeadFootAdapter<HeadViewHolder extends RecyclerView.ViewHolder,FootViewHolder extends RecyclerView.ViewHolder,ItemViewHolder extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //item的type 代表头部 中间 底部三个类型 static int TYPE_HEAD = 0; static int TYPE_ITEM = 1; static int TYPE_FOOT = 2; /** *头部ViewHolder **/ public abstract HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position); public abstract ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position); public abstract FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position); public abstract void onBindHeaderViewHolder(HeadViewHolder holder, int position); public abstract void onBindItemViewHolder(ItemViewHolder holder, int position); public abstract void onBindFooterViewHolder(FootViewHolder holder, int position); /** *根据viewType来创建不同的ViewHolder **/ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { switch (viewType){ case 0: return onCreateHeaderViewHolder(viewGroup,viewType); case 1: return onCreateItemViewHolder(viewGroup, viewType); default: return onCreateFooterViewHolder(viewGroup,viewType); } } /** *根据ViewType绑定数据 这里重新计算了position,使每个部分的position都从0开始 **/ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { int headCount = getHeadViewCount(); int itemViewCount = getItemViewCount(); int itemType = getItemViewType(i); switch (itemType){ case 0: onBindHeaderViewHolder((HeadViewHolder) viewHolder,i); break; case 1: onBindItemViewHolder((ItemViewHolder) viewHolder,i-headCount); break; case 2: onBindFooterViewHolder((FootViewHolder) viewHolder,i-itemViewCount-headCount); break; } } /** *adapter会调用这个方法来获取item的总数 *因为在这里 总数为上中下三部分数量加起来 不需要重写 *所以标志为final *返回所有View的数量 **/ @Override public final int getItemCount(){ return getHeadViewCount() + getFootViewCount() + getItemViewCount(); } /** *返回头部View的数量 **/ public abstract int getHeadViewCount(); /** *返回底部View的数量 **/ public abstract int getFootViewCount(); /** *返回中间View的数量 **/ public abstract int getItemViewCount(); /** *这句话是关键 根据position来判断item的类型 *adapter会将此方法的返回值传入onCreateViewHolder **/ @Override public int getItemViewType(int position) { // return super.getItemViewType(position); int headCount = getHeadViewCount(); int itemCount = getItemViewCount(); if(position<headCount){ return TYPE_HEAD; } if(position>headCount+itemCount-1){ return TYPE_FOOT; } return TYPE_ITEM; }}
这里我把Adapter重新封装了一遍,实现了上中下三个部分的ViewHolder的创建和数据绑定,基本语法和原来普通的RecyclerView的Adapter一样,下面是demo代码,代码很简单,就不解释了,item里面就放了一个TextView
package git.dzc.head_foot_recycleview;import android.graphics.Color;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import git.dzc.library.HeadFootAdapter;public class MainActivity extends AppCompatActivity { private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = (RecyclerView) findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(MainActivity.this)); rv.setAdapter(new HeadFootAdapter<HeadViewHolder,FootViewHolder,ItemViewHolder>() { @Override public HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false); return new HeadViewHolder(view); } @Override public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false); return new ItemViewHolder(view); } @Override public FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false); return new FootViewHolder(view); } @Override public void onBindHeaderViewHolder(HeadViewHolder holder, int position) { holder.tv.setTextColor(Color.GREEN); holder.tv.setTextSize(30); holder.tv.setText("head "+position); } @Override public void onBindItemViewHolder(ItemViewHolder holder, int position) { holder.tv.setText("item "+position); } @Override public void onBindFooterViewHolder(FootViewHolder holder, int position) { holder.tv.setTextColor(Color.BLUE); holder.tv.setTextSize(34); holder.tv.setText("foot "+position); } @Override public int getItemViewCount() { return 10; } @Override public int getHeadViewCount() { return 7; } @Override public int getFootViewCount() { return 8; } }); } class ItemViewHolder extends RecyclerView.ViewHolder{ public TextView tv; public ItemViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); } } class HeadViewHolder extends RecyclerView.ViewHolder{ public TextView tv; public HeadViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); } } class FootViewHolder extends RecyclerView.ViewHolder{ public TextView tv; public FootViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); } }}
这是效果图
更多相关文章
- android Pull解析xml 使用小结
- Android(安卓)http HttpURLConnection
- 【原创】一个android访问http资源的便捷工具类——HttpHelper
- Android(安卓)ListView addScrapView ArrayIndexOutOfBoundsExce
- android 返回键 退出
- android input系统如何导入kl文件
- Android下免Root权限截屏
- Android.API.Context.getFilesDir()
- Android(安卓)手机端与服务端POST数据交互类