使用泛型继承类,实现方法重载,避免使用instanceof判断类型
代码示例
基类:BaseNewsHolder.java
public class BaseNewsHolder<T extends NewsBaseInfo> extends RecyclerView.ViewHolder
implements View.OnClickListener {
public BaseNewsHolder(@NonNull View itemView) {
super(itemView);
mUserIcon = itemView.findViewById(R.id.elegant__mine_user_info__icon);
}
public void bindData(T baseInfo, int position, OnItemChangeListener listener) {
mPosition = position;
mData = baseInfo;
mListener = listener;
if (baseInfo != null && baseInfo.bookInfo != null) {
Glide.with(DkApp.get()).load(baseInfo.bookInfo.coverUrl).into(mBookCover);
bindHideableTextView(baseInfo.bookInfo.title, mTitle);
bindHideableTextView(baseInfo.bookInfo.author, mAuthor);
}
}
子类1:CommentNewsHolder.java
public class CommentNewsHolder extends BaseNewsHolder<CommentItem> {
public CommentNewsHolder(@NonNull View itemView) {
super(itemView);
mCommentLayout = itemView.findViewById(R.id.elegant__user_detail__content);
}
@Override
public void bindData(CommentItem commentItem, int position, OnItemChangeListener listener) {
super.bindData(commentItem, position, listener);
if (commentItem != null) {
bindHideableTextView(commentItem.comment.author, mNickName);
bindHideableTextView(commentItem.comment.content, mComment);
Date localDate = new Date(commentItem.comment.createTime * 1000);
bindHideableTextView(mSdf.format(localDate), mDate);
String commentTimes = DkApp.get().getString(R.string.reading__reading_view__comment);
if (commentItem.commentCommentsTotal > 0) {
commentTimes = commentTimes + commentItem.commentCommentsTotal;
}
bindHideableTextView(commentTimes, mCommentTimes);
}
}
}
子类2:NoteNewsHolder.java
public class NoteNewsHolder extends BaseNewsHolder<NoteItem> {
public NoteNewsHolder(@NonNull View itemView) {
super(itemView);
mQuote = itemView.findViewById(R.id.elegant__user_detail_quote_txt);
mCommentLayout = itemView.findViewById(R.id.elegant__user_detail__content);
}
@Override
public void bindData(NoteItem baseInfo, int position, OnItemChangeListener listener) {
super.bindData(baseInfo, position, listener);
if (baseInfo != null) {
bindHideableTextView(baseInfo.note.author, mNickName);
bindHideableTextView(baseInfo.note.refContent, mQuote);
bindHideableTextView(baseInfo.note.content, mComment);
Date localDate = new Date(baseInfo.note.createTime * 1000);
bindHideableTextView(mSdf.format(localDate), mDate);
}
}
}
数据结构:
基类: NewsBaseInfo.java
子类1: public class CommentItem extends NewsBaseInfo
子类2: public class NoteItem extends NewsBaseInfo
Adapter代码:NewsAdapter.java
public abstract class NewsAdapter extends RecyclerView.Adapter<BaseNewsHolder> implements BaseNewsHolder.OnItemChangeListener {
public static final int NOTE = 0;
public static final int COMMENT = 1;
private static final int PREFETCH_SIZE = 4;
private Context mContext;
private List<NewsBaseInfo> mData = new ArrayList<>();
public NewsAdapter(Context context) {
mContext = context;
}
public void setData(List<? extends NewsBaseInfo> data) {
mData.clear();
mData.addAll(data);
notifyDataSetChanged();
}
public void appendData(List<NewsBaseInfo> data) {
int position = getItemCount();
mData.addAll(data);
notifyItemRangeInserted(position, data.size());
}
@NonNull
@Override
public BaseNewsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == NOTE) {
View view = LayoutInflater.from(mContext).inflate(R.layout.elegant__user_news_idea, parent, false);
return new NoteNewsHolder(view);
} else {
View view = LayoutInflater.from(mContext).inflate(R.layout.elegant__user_news_comment, parent, false);
return new CommentNewsHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull BaseNewsHolder holder, int position) {
if (position + PREFETCH_SIZE > getItemCount()) {
tryLoadMore();
}
NewsBaseInfo data = mData.get(position);
holder.bindData(data, position, this);
}
@Override
public int getItemCount() {
return mData.size();
}
@Override
public int getItemViewType(int position) {
NewsBaseInfo info = mData.get(position);
if (info != null) {
return NewsBaseInfo.NOTE.equals(info.type) ? NOTE : COMMENT;
}
return NOTE;
}
protected abstract void tryLoadMore();
@Override
public void onItemDelete(int position) {
if (mData.size() > position && position >= 0) {
mData.remove(position);
notifyItemRemoved(position);
}
}
@Override
public void onItemChange(int position) {
if (mData.size() > position && position >= 0) {
notifyItemChanged(position);
}
}
}
总结: 若不使用泛型,那么在 onBindViewHolder 中需要根据 instanceof 判断当前 ViewHolder类型和 Data类型进行数据绑定。
使用泛型之后,可以重载bindData方法,自动根据当前ViewHolder类型执行其对应的bindData方法。