0
lent

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); 
}} 
+1

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

+0

Library Glide Utilisé et utiliser aussi vue recyclage avec vue sur la carte –

+0

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. –

Répondre

1

Malheureusement, je ne peux pas commenter, mais comme vous avez dit dans les commentaires, vous devez utiliser un RecyclerView (à moins que vos exigences incluent un ListView).

Voici un exemple d'un adaptateur RecyclerView que vous devriez être en mesure de personnaliser très facilement car il est proche de votre existant:

public class PropiedadCursorAdapter extends RecyclerView.Adapter<PropiedadCursorAdapter.ViewHolder> { 

private Context context; 

public SearchAdapter(Context context) { 
    super(); 
    this.context = context; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    private ImageView ivProfilePic; 
    private TextView tvUsername; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     ivProfilePic = (ImageView) itemView.findViewById(R.id.ivProfilePic); 
     tvUsername = (TextView) itemView.findViewById(R.id.tvUsername); 
    } 

} 

@Override 
public SearchAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_search_user, parent, false); 

    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    final User user = users.get(position); 

    Glide.with(context) 
      .load(user.getProfilePicUrl()) 
      .centerCrop() 
      .crossFade() 
      .diskCacheStrategy(DiskCacheStrategy.RESULT) 
      .into(holder.ivProfilePic); 

    holder.tvUsername.setText(user.getUsername()); 

} 

@Override 
public int getItemCount() { 
    return users.size(); 
} 
}