Android RecylerView多布局优化

本文介绍了一种基于RecyclerView的多布局解耦方案,通过定义接口和实现类的方式,简化了Adapter的编写过程,实现了不同类型的Item布局复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不废话,直接贴代码

public interface IViewItem<D,H extends RecyclerView.ViewHolder> {
    /**
     *
     * @param context
     * @param parent
     * @param l 这个是做类似于ListView OnItemClickListener 如需长按时间 多添加一个OnItemLongClickListener
     * @return
     */
    RecyclerView.ViewHolder onCreateViewHolder(Context context,ViewGroup parent,OnItemClickListener l);
    void onBindViewHolder(RecyclerView.ViewHolder holder,D data);
}
/**
 * @version 1.0
 * @email jacen@iswsc.com
 * Created by Jacen on 2017/12/29 15:05.
 */

public class MyAdapter extends RecyclerView.Adapter {

    private Context mContext;
    private List<ChatMessageVo> mList;
    private SparseArray<IViewItem> sparseArray;
    private OnItemClickListener l;

    private final int MESSAGE_LEFT_TEXT = 1;
    private final int MESSAGE_RIGHT_TEXT = 2;

    public MyAdapter(Context mContext, List<ChatMessageVo> mList,OnItemClickListener l) {
        this.mContext = mContext;
        this.mList = mList;
        this.l = l;
        sparseArray = new SparseArray<IViewItem>();
        sparseArray.put(MESSAGE_LEFT_TEXT,new ChatLeftTextViewItemImpl());
        sparseArray.put(MESSAGE_RIGHT_TEXT,new ChatRightTextViewItemImpl());
        //如果还有别的布局 添加聊天类型 以及实现类 配置一下这里就可以了
    }

    @Override
    public int getItemViewType(int position) {
        ChatMessageVo vo = mList.get(position);
        return vo.isMe() ? vo.getChatType().getRight() : vo.getChatType().getLeft();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return (RecyclerView.ViewHolder) sparseArray.get(viewType).onCreateViewHolder(mContext,parent,l);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        sparseArray.get(getItemViewType(position)).onBindViewHolder(holder,mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }
}
/**
 * @version 1.0
 * @email jacen@iswsc.com
 * Created by Jacen on 2017/12/28 22:24.
 */

public class ChatLeftTextViewItemImpl implements IViewItem {

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(Context context, ViewGroup parent, OnItemClickListener l) {
        View left_text = LayoutInflater.from(context).inflate( R.layout.item_chat_text_left, parent,false);
        return new LeftTextHolder(left_text, l);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, Object data) {
        LeftTextHolder h = (LeftTextHolder) holder;
        ChatMessageVo vo = (ChatMessageVo) data;
        h.mTime.setText(JacenUtils.parseChatTimer(vo.getSendTime()));
        h.mTime.setVisibility(vo.isShowTime() ? View.VISIBLE : View.GONE);
        h.mContent.setText(vo.getContent());
    }

    class LeftTextHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView mTime;
        ImageView mAvatar;
        TextView mContent;
        OnItemClickListener l;

        LeftTextHolder(View view, OnItemClickListener l) {
            super(view);
            view.setOnClickListener(this);
            this.l = l;
            mTime = (TextView) view.findViewById(R.id.time);
            mAvatar = (ImageView) view.findViewById(R.id.avatar);
            mContent = (TextView) view.findViewById(R.id.content);

        }

        @Override
        public void onClick(View v) {
            l.onItemClick(v, getLayoutPosition());
        }
    }
}

adapter里面是不是爽多了,再也不用去垒代码了,多一个item多一个实现类 在adapter构造函数里面配置一下就可以用了。

本文源自一家公司的面试官跟我提供的一些RecylerView多布局解耦的思路,面试完之后回来回想后写的,文中如有错误,或更好的办法,欢迎批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值