使用泛型继承类,实现方法重载,避免使用instanceof判断类型

使用泛型继承类,实现方法重载,避免使用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方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值