您的位置:首页 > 移动开发 > Android开发

Android RecyclerView多个Item布局的实现(可实现头部底部)

2015-10-10 11:57 951 查看
废话不多说,小猿,上代码

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);
}
}
}


这是效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: