Почему сделав scroll в ListView с изображениями, он становится медленным?

У меня есть проблема с listView, который показывает изображение, титул и описание. Прокрутив меня из-за listView, чтобы видеть элементы, которые внизу, или поднявшись снова, перемещение медленное. Я хотел бы знать: Как я могу оптимизировать код? или: Что нуждалось в том, чтобы сделать для того, чтобы перемещение было нормальным?

PropiedadCursorAdapter.java

public class PropiedadCursorAdapter extends CursorAdapter{

private LayoutInflater mLayoutInflater;
private Context ctx;
private  Cursor miCursor;
private int layout;


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);
    dbAdapter = new PropiedadDbAdapter(context);
    dbAdapter.abrir();
}

@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);


}

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

}
  }
4
задан 27.10.2016, 06:55
3 ответа

Picasso дает тебе возможность redimensionar изображение, ты можешь пытаться помещать его tamaГ±o точно vh.ivCasa и видеть, что он перемещает ^^

Picasso.with(context)
.resize(600, 200) // width, height
.centerCrop()
.load(stxtCasa).into(vh.ivCasa);
1
ответ дан 24.11.2019, 12:53
  • 1
    Спасибо, agregu и # 233; следующее: Picasso.with(context).load(stxtCasa).resize(100,100).centerCrop().into(vh.ivCasa); И я функция и # 243;. – Ivonne Lopez 27.10.2016, 21:35
  • 2
    @IvonneLopez, Если эта пошла, это solució n в твою проблему, пометь ее как правильный ответ – Maguz 19.01.2017, 18:24
  • 3
    @Maguz solució n он состоял в том, чтобы использовать RecyclerView, redimensionar я sirvió на минуту, но вновь войдя в aplicació n перемещение seguí в будучи медленным. – Ivonne Lopez 19.02.2017, 06:06

Когда инстанции твой adapter:

public PropiedadCursorAdapter(Context context, int layout, Cursor c){
    super(context, c);
    this.ctx = context;
    this.miCursor = c;


    mLayoutInflater = LayoutInflater.from(context);
    dbAdapter = new PropiedadDbAdapter(context);
    dbAdapter.abrir();
}

Внутри ты возвращаешься в instanciarlo, это может быть причина медлительности, которую ты испытываешь, так как каждый раз, когда инстанция, в строителе ты направляешь в instanciar adapter.

Удали эту линию, кроме того dbAdapter.abrir(); не, который операция реализует, но также может быть ненужной:

public PropiedadCursorAdapter(Context context, int layout, Cursor c){
    super(context, c);
    this.ctx = context;
    this.miCursor = c;


    mLayoutInflater = LayoutInflater.from(context);
//    dbAdapter = new PropiedadDbAdapter(context);
  //  dbAdapter.abrir();
}
0
ответ дан 24.11.2019, 12:53
  • 1
    Она была ненужной, уже elimin и # 233; но все продолжает быть равным. – Ivonne Lopez 27.10.2016, 20:21

Чтобы считать оптимизированным listView для того, чтобы он потратил меньше памяти ОЗУ, как у него также не было проблем доступной памяти давая исключение.

Важное:

  • Дело в том, что внутри персонализированного adapter только был использован LayoutInflater, если вид - null, или если не повторно использовался этот вид. Также важно использовать ViewHolder.

Гипотетический пример, чтобы давать тебе идею:

 if (convertView == null){
            convertView = this.mInflater.inflate(R.layout.fila_persona, null);
            viewHolder = new ViewHolder();

            viewHolder.textViewNombre = (TextView)convertView.findViewById(R.id.textViewNombre);
            viewHolder.textViewApellido = (TextView)convertView.findViewById(R.id.textViewApellido);
            viewHolder.textViewEdad = (TextView)convertView.findViewById(R.id.textViewEdad);
            viewHolder.thumb_persona = (ImageView)convertView.findViewById(R.id.thumb_persona);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder)convertView.getTag();
        }

Предупреди меня, потому что я только что попытался в примере, и он я идет супер быстро и у меня есть несколько элементов в списке. В моем примере используйте SimpleCursorAdapter, но не было бы проблемы приспосабливания в твой код.

0
ответ дан 24.11.2019, 12:53