当前位置: 代码迷 >> Android >> 用多行布局实现Android ListView
  详细解决方案

用多行布局实现Android ListView

热度:84   发布时间:2023-08-04 11:45:44.0

我正在尝试建立一个聊天页面(消息视图)。

有图像和文本消息。 我为此使用Firebase。

所以我尝试了自己的代码。 而且它也在显示图像。 我的意思是不同的布局正在工作。 但是问题是,在关闭应用程序后,然后当我重新打开时。 我看到的是字符串而不是图像的链接。

这是我的ArrayAdapter。

public class ChatAdapter extends BaseAdapter {
ArrayList<String> message = new ArrayList<> ();
ArrayList<Integer> image = new ArrayList<> ();

Context c;
String username;
String otherusername;

ArrayList<Integer> type = new ArrayList<> ();

public ChatAdapter(ArrayList<String> message, ArrayList<Integer> image, Context c, String username, String otherusername, ArrayList<Integer> type) {
    this.message = message;
    this.image = image;
    this.c = c;
    this.username = username;
    this.otherusername = otherusername;
    this.type = type;
}


@Override
public int getCount() {

    return message.size ();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

public static class ViewHolder {
    ImageView imageView;
    TextView messageView;
    CircleImageView profileImage;
}

@Override
public int getViewTypeCount() {
    return 4;
}

@Override
public int getItemViewType(int position) {
    return type.get (position);
}

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)

@Override

public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;
    int messageType = getItemViewType (position);

    ViewHolder holder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (messageType==1){
            v = View.inflate (c,R.layout.chatroom_image,null);



        }
        else {
            v = View.inflate (c, R.layout.message_item, null);



        }




    }
    if (messageType==1){
        holder = new ViewHolder ();
        holder.imageView = (ImageView) v.findViewById (R.id.imageMessage);
        holder.profileImage = (CircleImageView) v.findViewById (R.id.profile_image);
        Picasso.with(c).load(image.get (position)).into(holder.imageView);


    }
    else {
        holder = new ViewHolder ();
        holder.messageView = (TextView) v.findViewById (R.id.message_view);
        holder.profileImage = (CircleImageView) v.findViewById (R.id.profile_image);

        holder.messageView.setText (message.get (position));
        holder.profileImage.setImageResource (image.get (position));





    }

    return v;
}
}

在Firebase中,数据结构如下所示。

        messageList.setAdapter (new ChatAdapter (message_list, profile_img_list, getApplicationContext (), Fusername, chat_username,types));

而且我正在记录数据,它完美地显示了一切。

谢谢您的帮助。

我建议您使用RecyclerView而不是旧的ListView ListView确实有点过时了。

此处提供了有关如何在RecyclerView使用不同ItemView的示例: :

在当前实现中,如果convert视图不为null,则不会用数据填充项目。 这意味着列表视图将显示带有旧数据的项目。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        // inflate view

        // populate view
    }
}

尝试移动代码以在null检查之外填充视图持有者。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        // inflate view
    }

    // always populate view
}
  相关解决方案