Android Recyclerview多布局使用技巧

该文章主要记录,Rv中的多布局使用。

目录

1. 继承自RecyclerView.Adapter实现聊天多布局

 SparseArray的学习及使用

2. 使用BRVAH Adapter帮助类实现多布局 

1. 继承自RecyclerView.Adapter实现聊天多布局

实现该类多布局,主要是重写了getItemViewType,然后才是根据不同的数据类型去返回各自相对应的Item子布局。

而在onCreateViewHolder()中才是加载对应的itemType转换为对应的view即可。

 

/**
 * @author crazyZhangxl on 2019/1/15.
 * Describe: 多布局实现聊天通信 纯UI
 */
public class SessionAdapter extends RecyclerView.Adapter<OneViewHolder>{
    private Context mContext;
    private List<Message> mMessagesList;
    private static final int SEND_TEXT = R.layout.item_text_send;
    private static final int RECEIVE_TEXT = R.layout.item_text_receive;
    private static final int UNDEFINE_MSG = R.layout.item_no_support_msg_type;

    /**
     * 构造函数----
     * @param context
     * @param messagesList
     */
    public SessionAdapter(Context context, List<Message> messagesList) {
        mContext = context;
        mMessagesList = messagesList;
    }

    /**
     * 创建ViewHolder
     * @param viewGroup 父亲组件
     * @param viewType  文本布局资源文件[对应getItemViewType返回的类型]
     * @return
     */
    @NonNull
    @Override
    public OneViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        return new OneViewHolder(LayoutInflater.from(mContext).inflate(viewType, viewGroup,false), mContext);
    }

    /**
     * 绑定ViewHolder设置初始化
     * @param viewHolder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull OneViewHolder viewHolder, int position) {
        // 设置时间
        setTime(viewHolder,position);
        setName(viewHolder,position);
        setContent(viewHolder,position);
    }

    private void setName(OneViewHolder viewHolder, int position) {
        TextView tvName =  viewHolder.mConvertView.findViewById(R.id.tvName);
        tvName.setText(mMessagesList.get(position).getSendName());
    }

    private void setContent(OneViewHolder viewHolder, int position) {
        Message message = mMessagesList.get(position);
        if (message instanceof TextMessage){
            TextView tvMessage =  viewHolder.mConvertView.findViewById(R.id.tvText);
            TextMessage textMessage = (TextMessage) mMessagesList.get(position);
            tvMessage.setText(textMessage.getTextInfo());
        }
    }

    private void setTime(OneViewHolder viewHolder, int position) {
        TextView tvTime = viewHolder.mConvertView.findViewById(R.id.tvTime);
        Message message = mMessagesList.get(position);
        long sendTime = message.getSendTime();
        if (position > 0){
            long preTime = mMessagesList.get(position - 1).getSendTime();
            if (sendTime - preTime > 5*60*1000){
                tvTime.setVisibility(View.VISIBLE);
                tvTime.setText(TimeUtils.getInstance().longToTime(sendTime));
            }else {
                tvTime.setVisibility(View.GONE);
            }
        }else {
            tvTime.setVisibility(View.VISIBLE);
            tvTime.setText(TimeUtils.getInstance().longToTime(sendTime));
        }
    }

    /**
     * 对应各种消息类型[多布局的核心]
     * @param position 对应的下标position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        int viewType = UNDEFINE_MSG;
        Message message = mMessagesList.get(position);
        boolean isSend = message.getDirection() == MessageDirection.SEND.integerValue;
        switch (message.getMessageType()){
            case TEXT:
                viewType = isSend?SEND_TEXT:RECEIVE_TEXT;
                break;
            case IMAGE:
                break;
                default:
                    break;
        }
        return viewType;
    }

    @Override
    public int getItemCount() {
        if (mMessagesList == null){
            return 0;
        }
        return mMessagesList.size();
    }
}
/**
 * @author crazyZhangxl on 2019/1/15.
 * Describe: 基本的ViewHolder
 */
public class OneViewHolder extends RecyclerView.ViewHolder{
    protected View mConvertView;
    private Context mContext;

    public OneViewHolder(@NonNull View itemView) {
        super(itemView);
    }

    public OneViewHolder(@NonNull View itemView, Context context) {
        super(itemView);
        mConvertView = itemView;
        mContext = context;
    }

    public View getConvertView() {
        return mConvertView;
    }

    public void setConvertView(View convertView) {
        mConvertView = convertView;
    }

    public Context getContext() {
        return mContext;
    }

    public void setContext(Context context) {
        mContext = context;
    }
}

拓展内容

可以学习下优秀的人封装的ViewHolder,特点是对View的操作更加简洁了,而且封装了item的各种操作事件处理。还有一个知识点是 SparseArray<Views>的学习以及使用,优化的缓存方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值