如何使用具有 2 种布局的 FirebaseListAdapter
How to use FirebaseListAdapter with 2 layouts
所以我想在 Firebase API
的帮助下制作一个聊天应用程序,但似乎我无法在特定项目的布局之间更改(例如:发送和接收的消息)。我找到了一种方法,但效率不高,这种方法是这样的:我为发送和接收消息的模型制作了一个布局,然后如果收到消息我会隐藏发送框,如果消息是隐藏接收框发送
我将它用于我的适配器:
mPostAdapterChat = new FirebaseRecyclerAdapter<Chat, ChatViewHolder>(
Chat.class,
R.layout.item_layout_chat,
ChatViewHolder.class,
mChatRef
)
所以你们有什么方法可以使用 2 种布局并在它们之间更改每个项目(例如发送和接收的消息)或者你知道另一种方法我怎样才能比使用 gone/visibile
你实际上可以这样做:
1) 在您的聊天 class 中,确定消息的类型:发送或接收。添加属性或创建类似 isSent()
的方法来检查它是发送消息还是接收消息。我将使用 isSent()
方法作为示例。
2) 覆盖回收器视图适配器中的方法 getItemViewType
和 return 表示类型的 int(例如 0 表示发送,1 表示接收)
@Override
public int getItemViewType(int position) {
Chat chat = this.getItem(position);
if(chat.isSent()){
return 0;
}else{
return 1;
}
}
要在您的 RecyclerViewAdapter
重写 getItem 中获取项目:
@Override
public Chat getItem(int pos) {
return super.getItem(getCount() - 1 - pos);
}
3) 在您的 onCreateViewHolder
方法中,您可以访问视图类型,因此您可以简单地根据视图类型展开不同的布局。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: //inflate and return view holder type 0
case 1: //inflate and return view holder type 1
}
}
所以我想在 Firebase API
的帮助下制作一个聊天应用程序,但似乎我无法在特定项目的布局之间更改(例如:发送和接收的消息)。我找到了一种方法,但效率不高,这种方法是这样的:我为发送和接收消息的模型制作了一个布局,然后如果收到消息我会隐藏发送框,如果消息是隐藏接收框发送
我将它用于我的适配器:
mPostAdapterChat = new FirebaseRecyclerAdapter<Chat, ChatViewHolder>(
Chat.class,
R.layout.item_layout_chat,
ChatViewHolder.class,
mChatRef
)
所以你们有什么方法可以使用 2 种布局并在它们之间更改每个项目(例如发送和接收的消息)或者你知道另一种方法我怎样才能比使用 gone/visibile
你实际上可以这样做:
1) 在您的聊天 class 中,确定消息的类型:发送或接收。添加属性或创建类似 isSent()
的方法来检查它是发送消息还是接收消息。我将使用 isSent()
方法作为示例。
2) 覆盖回收器视图适配器中的方法 getItemViewType
和 return 表示类型的 int(例如 0 表示发送,1 表示接收)
@Override
public int getItemViewType(int position) {
Chat chat = this.getItem(position);
if(chat.isSent()){
return 0;
}else{
return 1;
}
}
要在您的 RecyclerViewAdapter
重写 getItem 中获取项目:
@Override
public Chat getItem(int pos) {
return super.getItem(getCount() - 1 - pos);
}
3) 在您的 onCreateViewHolder
方法中,您可以访问视图类型,因此您可以简单地根据视图类型展开不同的布局。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: //inflate and return view holder type 0
case 1: //inflate and return view holder type 1
}
}