Dans mon application, j'ai un ListView qui affiche une photo, le titre et la description. mais quand je fais défiler le ListView est si lent, même fermer l'application. ListView charge les éléments chaque fois que je défile, c'est pourquoi l'application plantage.ListView avec des photos se
Quelqu'un pourrait-il me aider à faire une ListView efficace?
Voici mon code:
public class PropiedadCursorAdapter extends CursorAdapter{
private LayoutInflater mLayoutInflater;
private Context ctx;
private Cursor miCursor;
private int layout;
private int casaIndex;
private int tituloIndex;
private int ubicacionIndex;
private PropiedadDbAdapter dbAdapter =null;
private class ViewHolder {
ImageView ivCasa;
TextView tvTitulo;
TextView tvUbicacion;
ViewHolder(View v) {
tvTitulo = (TextView) v.findViewById(R.id.tv_titulo);
tvUbicacion = (TextView) v.findViewById(R.id.tv_ubicacion);
ivCasa = (ImageView) v.findViewById(R.id.ivCasa);
}
}
public PropiedadCursorAdapter(Context context, int layout, Cursor c){
super(context, c);
this.ctx = context;
this.miCursor = c;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public void bindView(View v, Context context, Cursor c) {
int icol_ivCasa = c.getColumnIndex(C_COLUMNA_IMAGENES);
int icol_tvTitulo = c.getColumnIndex(PropiedadDbAdapter.C_COLUMNA_TITULO);
int icol_tvUbicacion = c.getColumnIndex(PropiedadDbAdapter.C_COLUMNA_DIRECCION);
String stxtCasa = c.getString(icol_ivCasa);
String stxtTitulo = c.getString(icol_tvTitulo);
String stxUbicacion = c.getString(icol_tvUbicacion);
ViewHolder vh = (ViewHolder)v.getTag();
Picasso.with(context).load(stxtCasa).into(vh.ivCasa);
vh.tvTitulo.setText(stxtTitulo);
vh.tvUbicacion.setText(stxUbicacion);
Log.d("PropiedadCursor", stxtCasa);
}
@Override
public View newView(Context ctx, Cursor cursor, ViewGroup parent) {
View vView = mLayoutInflater.inflate(R.layout.layout_lista_propiedades, parent, false);
vView.setTag(new ViewHolder(vView));
return vView;
}
}
Voici mon dbAdapter
public class PropiedadDbAdapter {
public static final String C_TABLAp = "PROPIEDADES";
/**
* TABLE PROPIEDADES
*/
public static final String C_COLUMNA_ID = "_id";
public static final String C_COLUMNA_TITULO = "titulo";
public static final String C_COLUMNA_PROPIEDAD = "propiedad";
public static final String C_COLUMNA_CATEGORIA = "categoria";
public static final String C_COLUMNA_COLONIA = "colonia";
public static final String C_COLUMNA_DIRECCION = "direccion";
public static final String C_COLUMNA_COORDENADAS = "coordenadas";
public static final String C_COLUMNA_SUPERFICIE = "superficie";
public static final String C_COLUMNA_RECAMARAS = "recamaras";
public static final String C_COLUMNA_IMAGENES = "imagenes";
public static final String C_COLUMNA_PRECIO = "precio";
public static final String C_COLUMNA_ANTIGUEDAD = "antiguedad";
public static final String C_COLUMNA_FECHA = "fecha";
public static final String C_COLUMNA_ACTUALIZACION= "actualizacion";
public static final String C_COLUMNA_EDO_SYNC= "edo_sync";
public static final String C_COLUMNA_DESCRIPCION = "descripcion";
public static final String C_COLUMNA_USR_PROP_ID= "prop_id";
private Context contexto;
private BienesRaDbHeper mDbHelper;
private SQLiteDatabase mDb;
private String[] columnasP = new String[]{C_COLUMNA_ID, C_COLUMNA_TITULO, C_COLUMNA_PROPIEDAD, C_COLUMNA_CATEGORIA, C_COLUMNA_COLONIA, C_COLUMNA_DIRECCION, C_COLUMNA_COORDENADAS, C_COLUMNA_SUPERFICIE, C_COLUMNA_RECAMARAS, C_COLUMNA_IMAGENES, C_COLUMNA_PRECIO, C_COLUMNA_ANTIGUEDAD, C_COLUMNA_FECHA, C_COLUMNA_ACTUALIZACION, C_COLUMNA_EDO_SYNC, C_COLUMNA_DESCRIPCION, C_COLUMNA_USR_PROP_ID};
private String[] columnaUserPropID = new String[]{C_COLUMNA_USR_PROP_ID};
public PropiedadDbAdapter(Context context)
{
this.contexto = context;
}
public PropiedadDbAdapter abrir() throws SQLException
{
mDbHelper = new BienesRaDbHeper(contexto);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void cerrar()
{
mDbHelper.close();
}
public Cursor getCursor() throws SQLException
{
Cursor cursor = mDb.query(true, C_TABLAp, columnasP, null, null, null, null, null, null);
return cursor;
}
public Cursor getRegistro(long id) throws SQLException
{
Cursor c = mDb.query(true, C_TABLAp, columnasP, C_COLUMNA_ID + "=" + id, null, null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
public long insertPropiedad(ContentValues reg)
{
if (mDb == null)
abrir();
return mDb.insert(C_TABLAp, null, reg);
}
public long update(ContentValues reg)
{
long result = 0;
if (mDb == null)
abrir();
if (reg.containsKey(C_COLUMNA_ID))
{
long id = reg.getAsLong(C_COLUMNA_ID);
reg.remove(C_COLUMNA_ID);
result = mDb.update(C_TABLAp, reg, "_id=" + id, null);
}
return result;
}
public Cursor getCursor(String filtro) throws SQLException
{
Cursor c = mDb.query(true, C_TABLAp, columnasP, filtro, null, null, null, null, null);
return c; }
public Cursor getIdProp(long id) throws SQLException {
Cursor c = mDb.query(true, C_TABLAp, columnasP, C_COLUMNA_USR_PROP_ID + "=" + id, null, null,null,null,null);
if (c != null) {
c.moveToFirst();
Log.d("PROPIEDAD", String.valueOf(c));
}
return c;
}
public long delete(long id)
{
if (mDb == null)
abrir();
return mDb.delete(C_TABLAp, "_id=" + id, null);
}}
prendre mise à jour peu! utiliser la vue Recycler plutôt la liste alors vue, il vous donne une expérience utilisateur fluide, reportez-vous cette http://www.androidhive.info/2016/01/android-working-with-recycler-view/ – Radhey
Library Glide Utilisé et utiliser aussi vue recyclage avec vue sur la carte –
Bien que je suis d'accord avec @Radhey, mais je ne pense pas que nous devrions forcer notre préférence à op. Peut-être que c'est l'exigence pour le projet op. –