java - 使用 Android FirebaseListAdapter 时如何使用两种布局?

标签 java android firebase chat

我正在制作一个使用 Cloud Firebase 的 Android 聊天应用。在用消息填充 ListView 时,我想使用两种布局,一种用于传入消息,一种用于传出消息。当遵循执行类似操作的教程时,

( http://www.devexchanges.info/2016/12/simple-chat-application-using-firebase.html )

他们创建了自己的 messageAdapter 类,该类引入了一个 getView 函数,该函数将根据消息返回两个 View 之一。但在此类的构造函数中, super() 语句对我不起作用。这是构造函数:

public MessageAdapter(Lobby activity, Class<ChatMessage> modelClass, int modelLayout, DatabaseReference ref) {

        super(activity, modelClass, modelLayout, ref);
        this.activity = activity;
    }

这与教程使用它完全相同,但由于某种原因在我自己的应用程序上下文中它不起作用。我必须对 FirebaseListAdapter 类执行某些操作才能允许此操作吗?如果您需要查看我的项目中的任何其他代码,我将很乐意编辑以包含它,任何帮助将不胜感激。谢谢。

最佳答案

尝试使用 RecyclerView 和 RecyclerView.Adapter 而不是 FirebaseListAdapter,如下所示:

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
    private static final int CHAT_END = 1;
    private static final int CHAT_START = 2;

    private List<Chat> mDataSet;
    private String mId;

    /**
     * Called when a view has been clicked.
     *
     * @param dataSet Message list
     * @param id      Device id
     */
    ChatAdapter(List<Chat> dataSet, String id) {
        mDataSet = dataSet;
        mId = id;
    }

    @Override
    public ChatAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;

        if (viewType == CHAT_END) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_end, parent, false);
        } else {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_start, parent, false);
        }

        return new ViewHolder(v);
    }

    @Override
    public int getItemViewType(int position) {
        if (mDataSet.get(position).getId().equals(mId)) {
            return CHAT_END;
        }

        return CHAT_START;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Chat chat = mDataSet.get(position);
        holder.mTextView.setText(chat.getMessage());
    }

    @Override
    public int getItemCount() {
        return mDataSet.size();
    }

    /**
     * Inner Class for a recycler view
     */
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView mTextView;

        ViewHolder(View v) {
            super(v);
            mTextView = (TextView) itemView.findViewById(R.id.tvMessage);
        }
    }
}

更多信息请访问https://github.com/thaleslima/firebase-chat-sample .

关于java - 使用 Android FirebaseListAdapter 时如何使用两种布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47525110/

相关文章:

java - 如何在 Java 中正确制作线程安全的单例工厂?

java - 将 Joda-Time DateTime - ISO 8601 格式日期转换为另一种日期格式

java - jpql (JPA) 中重复的父子数据

android - FirebaseMessagingService 未运行

java - 使用来自 java 的证书连接到 web 服务

android - 应用关闭时推送通知

java - 如何在没有证书的情况下连接到 https 网络服务?

安卓 : How to Create Dividers between Components

javascript - 无法从 Firestore 值解码类型

java - 使用Firebase时(org.gradle.api.tasks.TaskExecutionException:任务 ':app:compileDebugJavaWithJavac'的执行失败)