Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用listview实现具有异构行类型(图像、视频和文本)的聊天列表视图?_Android_Android Listview_Chat_Android Recyclerview - Fatal编程技术网

Android 如何使用listview实现具有异构行类型(图像、视频和文本)的聊天列表视图?

Android 如何使用listview实现具有异构行类型(图像、视频和文本)的聊天列表视图?,android,android-listview,chat,android-recyclerview,Android,Android Listview,Chat,Android Recyclerview,我正在构建一个普通的聊天应用程序。可以发送图像、文本和视频,因此我需要列表中的多行样式。我使用了listview。但Listview多次返回(在回收行之后)错误的行,我的尝试失败。你知道怎么做吗?这可以使用RecyclerView完成吗? 谢谢。可以用recyclerview完成。下面是我在一个recyclerview中显示多种类型行所做的工作 // Different types of rows private static final int TYPE_ITEM1 = 0; private

我正在构建一个普通的聊天应用程序。可以发送图像、文本和视频,因此我需要列表中的多行样式。我使用了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
     }
}
//不同类型的行
私有静态final int TYPE_ITEM1=0;
私有静态最终int类型_ITEM2=1;
公共类MyAdapter扩展了RecyclerView.Adapter{
类ViewHolder0扩展了RecyclerView.ViewHolder{
//行类型0的Viewholder
}
类ViewHolder1扩展了RecyclerView.ViewHolder{
//行类型1的视图保持架
}
@凌驾
public int getItemViewType(int位置){
//在这里,您必须为哪个位置编写逻辑,并返回相同的行类型
如果(位置==0){
返回类型_ITEM0;
}否则{
返回类型_ITEM1;
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
开关(视图类型){
案例0:返回新的ViewHolder0(LayoutInflater.from(viewGroup.getContext())
.充气(R.layout.itme0,视图组,false););
案例1:返回新的ViewHolder1(LayoutInflater.from(viewGroup.getContext())
.充气(R.layout.item1,viewGroup,false););
...
}
}
@凌驾
public void onBindViewHolder(final RecyclerView.ViewHolder ViewHolder,int位置){
if(viewHolder.getItemViewType()==类型\u ITEM0){
//在此处填充类型0视图的代码
}else if(viewHolder.getItemViewType()=类型\u ITEM1){
//此处填充类型1视图的代码
}
}

这可以通过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
     }
}
//不同类型的行
私有静态final int TYPE_ITEM1=0;
私有静态最终int类型_ITEM2=1;
公共类MyAdapter扩展了RecyclerView.Adapter{
类ViewHolder0扩展了RecyclerView.ViewHolder{
//行类型0的Viewholder
}
类ViewHolder1扩展了RecyclerView.ViewHolder{
//行类型1的视图保持架
}
@凌驾
public int getItemViewType(int位置){
//在这里,您必须为哪个位置编写逻辑,并返回相同的行类型
如果(位置==0){
返回类型_ITEM0;
}否则{
返回类型_ITEM1;
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
开关(视图类型){
案例0:返回新的ViewHolder0(LayoutInflater.from(viewGroup.getContext())
.充气(R.layout.itme0,视图组,false););
案例1:返回新的ViewHolder1(LayoutInflater.from(viewGroup.getContext())
.充气(R.layout.item1,viewGroup,false););
...
}
}
@凌驾
public void onBindViewHolder(final RecyclerView.ViewHolder ViewHolder,int位置){
if(viewHolder.getItemViewType()==类型\u ITEM0){
//在此处填充类型0视图的代码
}else if(viewHolder.getItemViewType()=类型\u ITEM1){
//此处填充类型1视图的代码
}
}