最開始使用listview的時候有大神封裝了adapter,現在使用recyclerview,依葫蘆畫瓢對adapter進行了封裝,使用方法如下
如果是一種類型的item
public class StudentAdapter extends RecycleCommenAdapter<Student> {
/**
* @param context
* @param list
*/
public StudentAdapter(Context context, List<Student> list) {
super(context, list, R.layout.item_student);
}
@Override
public void convert(RecycleViewHolder holder, Student student) {
holder.setText(R.id.tv_student_age,String.valueOf(student.getAge())).setText(R.id.tv_student_name, student.getName());
}
}
如上所示,在構造方法裡中super方法中添加布局
在covert方法中适配資料就OK啦
如果是多種item的adapter
首先,重寫getItemViewType方法
@Override
public int getItemViewType(int position) {
return students.get(position).getAge() %2==0? ITEM_VIEW_TYPE_HEADER
: ITEM_VIEW_TYPE_ITEM;
}
我這裡測試根據學生年齡的不同傳回兩個不同的常量
然後根據VIewType的不同建立不同的viewholder
@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
View view = null;
if (arg1 == ITEM_VIEW_TYPE_HEADER) {
view = LayoutInflater.from(context).inflate(
R.layout.item_student, arg0, false);
} else if (arg1 == ITEM_VIEW_TYPE_ITEM) {
view = LayoutInflater.from(context).inflate(
R.layout.item_student_mult, arg0, false);
}
return RecycleViewHolder.get(view);
}
最後就是适配資料啦
@Override
public void onBindViewHolder(RecycleViewHolder arg0, int arg1) {
int itemViewType = getItemViewType(arg1);
if (itemViewType == ITEM_VIEW_TYPE_HEADER) {
arg0.setText(R.id.tv_student_name,students.get(arg1).getName());
} else if (itemViewType == ITEM_VIEW_TYPE_ITEM) {
}
arg0.setText(R.id.tv_student_age,String.valueOf(students.get(arg1).getAge()));
}
最後貼上完整的代碼
package com.example.master.customadapter.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.master.customadapter.R;
import com.example.master.customadapter.model.Student;
import java.util.ArrayList;
public class Multi_Item_Adapter extends RecyclerView.Adapter<RecycleViewHolder> {
private ArrayList<Student> students;
private Context context;
private static final int ITEM_VIEW_TYPE_HEADER = 0;
private static final int ITEM_VIEW_TYPE_ITEM = 1;
public Multi_Item_Adapter(ArrayList<Student> sutdents, Context context) {
super();
this.students = sutdents;
this.context = context;
}
@Override
public int getItemCount() {
return students.size();
}
@Override
public void onBindViewHolder(RecycleViewHolder arg0, int arg1) {
int itemViewType = getItemViewType(arg1);
if (itemViewType == ITEM_VIEW_TYPE_HEADER) {
arg0.setText(R.id.tv_student_name,students.get(arg1).getName());
} else if (itemViewType == ITEM_VIEW_TYPE_ITEM) {
}
arg0.setText(R.id.tv_student_age,String.valueOf(students.get(arg1).getAge()));
}
@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
View view = null;
if (arg1 == ITEM_VIEW_TYPE_HEADER) {
view = LayoutInflater.from(context).inflate(
R.layout.item_student, arg0, false);
} else if (arg1 == ITEM_VIEW_TYPE_ITEM) {
view = LayoutInflater.from(context).inflate(
R.layout.item_student_mult, arg0, false);
}
return RecycleViewHolder.get(view);
}
@Override
public int getItemViewType(int position) {
return students.get(position).getAge() %2==0? ITEM_VIEW_TYPE_HEADER
: ITEM_VIEW_TYPE_ITEM;
}
}
last but not the least 哈哈哈,當然是源碼位址了
github 位址 https://github.com/looooker/CustomAdapter
還有一位大神對adapter進行了更進一步的封裝,代碼邏輯都是一樣的,估計都是參考了同一位大神的代碼,
同樣也貼上位址 https://github.com/mikepenz/FastAdapter