我正在创建一个消息传递应用程序,到目前为止发送文本完美无缺。但我很难实现文件传输。
我打开图库,选择图像并发送。该信息由服务器使用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)
我不明白为什么在控制权如此之多的情况下执行该代码时,如果该值为空。
答案 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());
...
}