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