Java 使用Android FirebaseListAdapter时,如何使用两种布局?

Java 使用Android FirebaseListAdapter时,如何使用两种布局?,java,android,firebase,chat,Java,Android,Firebase,Chat,我正在制作一个使用云Firebase的Android聊天应用程序。在用消息填充listview时,我想使用两种布局,一种用于传入消息,另一种用于传出消息。当学习这样的教程时 () 他们创建自己的messageAdapter类,该类引入一个getView函数,该函数将根据消息返回两个视图中的一个。但是,在这个类的构造函数中,super()语句对我不起作用。以下是构造函数: public MessageAdapter(Lobby activity, Class<ChatMessage>

我正在制作一个使用云Firebase的Android聊天应用程序。在用消息填充listview时,我想使用两种布局,一种用于传入消息,另一种用于传出消息。当学习这样的教程时

()

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

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

        super(activity, modelClass, modelLayout, ref);
        this.activity = activity;
    }
public MessageAdapter(大厅活动、类modelClass、int modelLayout、数据库参考ref){
超级(活动、模型类、模型布局、参考);
这个。活动=活动;
}

这与教程中使用的完全相同,但由于某种原因,在我自己的应用程序上下文中,它不起作用。要允许此操作,我是否必须对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);
        }
    }
}
公共类ChatAdapter扩展了RecyclerView.Adapter{
专用静态最终int CHAT_END=1;
专用静态最终int CHAT_START=2;
私有列表数据集;
私有字符串mId;
/**
*单击视图时调用。
*
*@param数据集消息列表
*@param id设备id
*/
ChatAdapter(列表数据集,字符串id){
mDataSet=数据集;
mId=id;
}
@凌驾
public ChatAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
观点五;
如果(视图类型==聊天结束){
v=LayoutInflater.from(parent.getContext()).flate(R.layout.list\u item\u chat\u end,parent,false);
}否则{
v=LayoutInflater.from(parent.getContext()).flate(R.layout.list\u item\u chat\u start,parent,false);
}
返回新的视图持有者(v);
}
@凌驾
public int getItemViewType(int位置){
if(mDataSet.get(position.getId().equals(mId)){
返回聊天室结束;
}
返回聊天开始;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Chat Chat=mDataSet.get(位置);
holder.mTextView.setText(chat.getMessage());
}
@凌驾
public int getItemCount(){
返回mDataSet.size();
}
/**
*回收器视图的内部类
*/
类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图mTextView;
视图支架(视图v){
超级(五);
mTextView=(TextView)itemView.findviewbyd(R.id.tvMessage);
}
}
}
请访问查看更多信息