0

私のアプリでは、ListViewに写真、タイトル、および説明が表示されます。 でも、スクロールするとListViewが遅くなってアプリを閉じることさえできます。 ListViewはスクロールするたびに要素を読み込んでいます。そのためアプリがクラッシュします。ListView with photos slow

誰かが効率的なListViewを手伝ってくれますか?ここで

は私のコードです:ここでは

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; 
    }  
} 

は私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

は更新を少し取ります!リサイクルビューをリストビューではなく使用すると、スムーズなユーザーエクスペリエンスが得られます。http://www.androidhive.info/2016/01/android-working-with-recycler-view/ – Radhey

+0

中古グライドライブラリとリサイクルビューも使用しますカードビューあり –

+0

私は@Radheyに同意しますが、私は私たちの設定を強制するべきではないと思います。おそらく、これはopプロジェクトの要件です。 –

答えて

1

です残念ながら、私はコメントすることはできませんが、あなたがコメントで言われてきただけのように、あなたが使用する必要がありますRecyclerView(あなたの要件にListViewが含まれていない場合)ここで

は、あなたがそれはあなたの既存のものと類似しているとして、非常に簡単にカスタマイズすることができるはずですRecyclerViewアダプタの例です:

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(); 
} 
}