繁体   English   中英

我可以在一个 RecycleView Adapter 中增加两个列表布局吗?

[英]may i inflate two list layout in one RecycleView Adapter?

我想做什么? 我有一个 SQLite 数据表,我想从该数据表中为不同的活动显示不同的列。 为此,我使用回收视图,并为该回收视图创建两个模型列表视图布局。 然后创建一个 RecylerView Adapter。 onCreateViewHolder方法中,我想膨胀两个模型列表视图布局。 这是我的意思的代码

您可以尝试按照 recyclerview 多视图类型在一个适配器类中托管两个布局

recyclerview 多视图类型

是的,你可以这样做。

多亏了getItemViewType方法,您可以返回不同的view type值,这些值可以在onCreateViewHolder捕获,并取决于您可以膨胀不同布局的值。

我能够为聊天消息创建一个适配器,无论是发送还是接收text/image我根据view typeviewType膨胀不同的布局

指定viewType值的代码

@Override
public int getItemViewType(int position) {
    /**
     * check the user id to detect if a message sent or received
     * then check if a message is a text or image
     */

    String userID = Constant.itemUser.getId();
    MessageModel message = messages.get(position);

    if (userID.equals(message.getUserId())) {

        if (message.getType().equals("1")) {
            return MessageType.SENT_TEXT;
        } else if (message.getType().equals("2")) {
            return MessageType.SENT_IMAGE;
        }

    } else {

        if (message.getType().equals("1")) {
            return MessageType.RECEIVED_TEXT;
        } else if (message.getType().equals("2")) {
            return MessageType.RECEIVED_IMAGE;
        }

    }
    return super.getItemViewType(position);
}

并在名为onCreateViewHolder的方法中

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    /**
     * check the type of view and return holder
     */
    if (viewType == MessageType.SENT_TEXT) {
        return new SentTextHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_sent_message_text, parent, false));
    } else if (viewType == MessageType.SENT_IMAGE) {
        return new SentImageHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_sent_message_img, parent, false));
    } else if (viewType == MessageType.RECEIVED_TEXT) {
        return new ReceivedTextHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_received_message_text, parent, false));
    } else if (viewType == MessageType.RECEIVED_IMAGE) {
        return new ReceivedImageHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_received_message_img, parent, false));
    }

    return null;
}

请不要忘记在onBindViewHolder处理holders

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder mHolder, int position) {

    int type = getItemViewType(position);
    MessageModel message = messages.get(position);
    /**
     * check message type and init holder to user it and set data in the right place for every view
     */
    if (type == MessageType.SENT_TEXT) {
       // case of message sent of type text
    } else if (type == MessageType.SENT_IMAGE) {
       // case of message sent of type img
    } else if (type == MessageType.RECEIVED_TEXT) {
        ReceivedTextHolder holder = (ReceivedTextHolder) mHolder;
        // case of the message received of type text

    } else if (type == MessageType.RECEIVED_IMAGE) {
        // etc
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM