在列表视图上的特定位置显示图像

时间:2018-04-23 08:50:23

标签: java android listview uiimageview chat

我正在创建一个消息传递应用程序,到目前为止发送文本完美无缺。但我很难实现文件传输。

我打开图库,选择图像并发送。该信息由服务器使用PHP收集,并使用字段(用户,消息,日期,文件)在mysql数据库中插入数据。文件字段有时为空。

public class Chati_LVAdapter extends BaseAdapter {
//Variables globales
Context context;
List<Chati_class> list_chati_mess;
String filename = "";

//Variables auxiliares de apoyo
private static final int LAYOUT_PROPIO = 0, LAYOUT_OTROS = 1, NO_FILE = 0, ATTACHED_FILE = 1;
private static final String URL_FILES = "http://SOMEURL/img/";
LayoutInflater mInflater;
String nombre_real = "";

//Clase estática para almacenar variables
private static class ContactsPlaceholder {
    public TextView fecha;
    public TextView nombre;
    public TextView ultimo_mensaje;
    public ImageButton foto_adjunta;
}

//Constructor de la clase
Chati_LVAdapter(List<Chati_class> list_chati_message, Context context) {
    //Inicializamos todas las variables necearias para nuestro chat
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    this.list_chati_mess = list_chati_message;
    DBHandler db = new DBHandler(context);
    nombre_real = db.getNameReal(ClassCOM.getUserLogged(context));
}

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

@Override
public int getItemViewType(int position) {
    //Obtendremos el tipo de layout a mostrar por cada mensaje de chat
    Chati_class user = list_chati_mess.get(position);
    //Si el autor del mensaje es el mismo que el usuario que ha iniciado sesión, devolveremos un valor X
    if (user.getAutor().equalsIgnoreCase(nombre_real)) {
        return LAYOUT_PROPIO;
    } else return LAYOUT_OTROS; //En caso contrario devolveremos otro valor estático
}

@Override
public int getCount() {
    return list_chati_mess.size();
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //Obtendremos la posicion actual de nuestro listview del chat
    final Chati_class p = list_chati_mess.get(position);
    ContactsPlaceholder holder;

    //Comprobaremos si la variable convertView "no" es nula
    if (convertView == null) {
        //Si es nula crearemos una nueva vista de chat
        holder = new ContactsPlaceholder();
        TextView fecha = null;
        TextView ult_mensaje = null;
        TextView nombre = null;
        ImageButton foto_adjunta = null;

        switch(getItemFile(position)){
            case NO_FILE:
                switch (getItemViewType(position)) {
                    case LAYOUT_PROPIO:
                        convertView = mInflater.inflate(R.layout.lay_listview_chati_pr, null);
                        fecha = convertView.findViewById(R.id.textView_chati_pr_date);
                        ult_mensaje = convertView.findViewById(R.id.textView_chati_pr_message);
                        nombre = convertView.findViewById(R.id.textView_chati_pr_name);
                        break;
                    case LAYOUT_OTROS:
                        if (ClassCOM.getAppColorString(context).equals("blue")) {
                            convertView = mInflater.inflate(R.layout.lay_listview_chati_ot_azul, null);
                            fecha = convertView.findViewById(R.id.textView_chati_o_date);
                            ult_mensaje = convertView.findViewById(R.id.textView_chati_o_message);
                            nombre = convertView.findViewById(R.id.textView_chati_o_name);
                        } else {
                            convertView = mInflater.inflate(R.layout.lay_listview_chati_ot_rojo, null);
                            fecha = convertView.findViewById(R.id.textView_chati_o_date);
                            ult_mensaje = convertView.findViewById(R.id.textView_chati_o_message);
                            nombre = convertView.findViewById(R.id.textView_chati_o_name);
                        }
                        break;
                }
                break;
            case ATTACHED_FILE:
                switch (getItemViewType(position)) {
                    case LAYOUT_PROPIO:
                        convertView = mInflater.inflate(R.layout.lay_listview_chati_pr_file, null);
                        fecha = convertView.findViewById(R.id.textView_chati_pr_date_f);
                        ult_mensaje = convertView.findViewById(R.id.textView_chati_pr_message_f);
                        nombre = convertView.findViewById(R.id.textView_chati_pr_name_f);
                        foto_adjunta = convertView.findViewById(R.id.imagen_adjunta_pr);
                        break;
                    case LAYOUT_OTROS:
                        if (ClassCOM.getAppColorString(context).equals("blue")) {
                            convertView = mInflater.inflate(R.layout.lay_listview_chati_ot_azul_file, null);
                            fecha = convertView.findViewById(R.id.textView_chati_o_date_f);
                            ult_mensaje = convertView.findViewById(R.id.textView_chati_o_message_f);
                            nombre = convertView.findViewById(R.id.textView_chati_o_name_f);
                            foto_adjunta = convertView.findViewById(R.id.imagen_adjunta_o);
                        } else {
                            convertView = mInflater.inflate(R.layout.lay_listview_chati_ot_rojo_file, null);
                            fecha = convertView.findViewById(R.id.textView_chati_o_date_f);
                            ult_mensaje = convertView.findViewById(R.id.textView_chati_o_message_f);
                            nombre = convertView.findViewById(R.id.textView_chati_o_name_f);
                            foto_adjunta = convertView.findViewById(R.id.imagen_adjunta_o);
                        }
                        break;
                }
                if(p.getFoto() != null) {
                    String file = p.getFoto();
                    if(file.length() > 0) {
                        String ext = file.substring(file.lastIndexOf("."), file.length());
                        if (ext.equals(".jpg") || ext.equals(".png") || ext.equals(".gif") || ext.equals(".raw") || ext.equals(".webp") || ext.equals(".bmp")) {
                            Picasso.with(context).load(URL_FILES + p.getFoto()).into(foto_adjunta);
                            foto_adjunta.setVisibility(View.VISIBLE);
                        } else {
                            foto_adjunta.setImageResource(R.drawable.file_icon);
                            foto_adjunta.setMaxHeight(350);
                            foto_adjunta.setVisibility(View.VISIBLE);
                        }
                        holder.foto_adjunta = foto_adjunta;
                    }
                }
                break;
        }
        holder.fecha = fecha;
        holder.ultimo_mensaje = ult_mensaje;
        holder.nombre = nombre;

        convertView.setTag(holder);
    } else {
        holder = (ContactsPlaceholder) convertView.getTag();
    }
    final ImageButton info_foto = convertView.findViewById(R.id.imagen_adjunta_o);
    if (info_foto != null) {
        info_foto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                filename = p.getFoto();
                new DescargaFoto(context, filename, URL_FILES);
            }
        });
    }
    holder.ultimo_mensaje.setText(p.getMensaje());
    holder.fecha.setText(p.getFecha());
    holder.nombre.setText(p.getAutor());

    return convertView;
}

public int getItemFile(int position) {
    //Obtendremos el tipo de layout a mostrar por cada mensaje de chat
    Chati_class user = list_chati_mess.get(position);
    //Si el autor del mensaje es el mismo que el usuario que ha iniciado sesión, devolveremos un valor X
    if (user.getFoto() != null) {
        Log.i("FOTO NO NULL", user.getFoto());
        return ATTACHED_FILE;
    } else return NO_FILE; //En caso contrario devolveremos otro valor estático
}}

正如你所看到的那样,使用如此多的布局是一件混乱的事情,但问题仍然存在:

String ext = file.substring(file.lastIndexOf("."), file.length());

即使所有ifs都试图避免它,我也会得到一个null错误。

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: es.monlau.smartschool, PID: 6325
                  java.lang.StringIndexOutOfBoundsException: length=4; index=-1
                      at java.lang.String.substring(String.java:1968)
                      at es.monlau.smartschool.Chati_LVAdapter.getView(Chati_LVAdapter.java:155)

我不明白为什么在控制权如此之多的情况下执行该代码时,如果该值为空。

1 个答案:

答案 0 :(得分:1)

您没有收到“null”错误,但是:

java.lang.StringIndexOutOfBoundsException: length=4; index=-1

所以错误说你使用-1作为substring方法。使用file.lastIndexOf(".")获得-1,所以基本上没有“。”在字符串中,这就是你得到-1的原因。在尝试提取文件扩展名之前,如果indexOf的结果首先返回大于-1的结果,则应检查:

int dotIndex = file.lastIndexOf(".");
if(dotIndex  > -1) {
    String ext = file.substring(dotIndex, file.length());
    ...
}