你正在思考正确的方向 . 我已经创建了一个解决问题的类:
public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter {
private int mModelLayout;
private Class mViewHolderClass;
private List mList = new ArrayList<>();
public BaseRecyclerAdapter(Class viewHolderClass, int modelLayout) {
mModelLayout = modelLayout;
mViewHolderClass = viewHolderClass;
}
public void setmList(List mList) {
this.mList = mList;
}
@Override
public int getItemCount() {
return mList.size();
}
public T getItem(int position) {
return mList.get(position);
}
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
try {
Constructor constructor = mViewHolderClass.getConstructor(View.class);
return constructor.newInstance(view);
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@Override
public void onBindViewHolder(VH viewHolder, int position) {
T model = getItem(position);
populateViewHolder(viewHolder, model, position);
}
@Override
public int getItemViewType(int position) {
return mModelLayout;
}
abstract protected void populateViewHolder(VH viewHolder, T model, int position);
public void addItem(T t) {
int index = mList.size();
mList.add(index, t);
notifyItemInserted(index);
}
public void updateItem(int position, T t) {
mList.set(position, t);
notifyItemChanged(position);
}
public void removeItem(int position) {
mList.remove(position);
notifyItemRemoved(position);
}
public void setItems(List items) {
mList = items;
notifyDataSetChanged();
}
public class BaseViewHolder extends RecyclerView.ViewHolder {
public BaseViewHolder(View view) {
super(view);
}
}
}
如何使用它:
private BaseRecyclerAdapter mBaseRecyclerAdapter = new BaseRecyclerAdapter(UserViewHolder.class, R.layout.layout_list_item_friends) {
@Override
protected void populateViewHolder(UserViewHolder viewHolder, User model, int position) {
// You can do here whatever you want
}
};