如何使用列表视图实现具有异构行类型(图像视频和文本)的聊天列表视图?
How to implement a chat list view with heterogenous row types (image video and text) using listview?
我正在构建一个普通的聊天应用程序。可以发送图像、文本和视频,因此我的列表中需要多个行样式。我使用列表视图。但是 Listview 多次返回(在回收行之后)错误的行,我的尝试失败了。任何想法如何做到这一点?这可以使用 RecyclerView 完成吗?
谢谢。
可以用recyclerview来完成。这是我在单个 recyclerview
中显示多种类型的行所做的
// Different types of rows
private static final int TYPE_ITEM1 = 0;
private static final int TYPE_ITEM2 = 1;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class ViewHolder0 extends RecyclerView.ViewHolder {
// Viewholder for row type 0
}
class ViewHolder1 extends RecyclerView.ViewHolder {
// Viewholder for row type 1
}
@Override
public int getItemViewType(int position) {
// Here you have to write logic for which position have which type of row and return the same
if (position == 0) {
return TYPE_ITEM0;
} else {
return TYPE_ITEM1;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new ViewHolder0(LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.itme0, viewGroup, false););
case 1: return new ViewHolder1(LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item1, viewGroup, false););
...
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder.getItemViewType() == TYPE_ITEM0) {
// Code to populate type 0 view here
} else if (viewHolder.getItemViewType() == TYPE_ITEM1) {
// code to populate type 1 view here
}
}
我正在构建一个普通的聊天应用程序。可以发送图像、文本和视频,因此我的列表中需要多个行样式。我使用列表视图。但是 Listview 多次返回(在回收行之后)错误的行,我的尝试失败了。任何想法如何做到这一点?这可以使用 RecyclerView 完成吗? 谢谢。
可以用recyclerview来完成。这是我在单个 recyclerview
中显示多种类型的行所做的// Different types of rows
private static final int TYPE_ITEM1 = 0;
private static final int TYPE_ITEM2 = 1;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class ViewHolder0 extends RecyclerView.ViewHolder {
// Viewholder for row type 0
}
class ViewHolder1 extends RecyclerView.ViewHolder {
// Viewholder for row type 1
}
@Override
public int getItemViewType(int position) {
// Here you have to write logic for which position have which type of row and return the same
if (position == 0) {
return TYPE_ITEM0;
} else {
return TYPE_ITEM1;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new ViewHolder0(LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.itme0, viewGroup, false););
case 1: return new ViewHolder1(LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item1, viewGroup, false););
...
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder.getItemViewType() == TYPE_ITEM0) {
// Code to populate type 0 view here
} else if (viewHolder.getItemViewType() == TYPE_ITEM1) {
// code to populate type 1 view here
}
}