刷新BaseAdapter上的数据

时间:2017-04-20 19:46:35

标签: android baseadapter notifydatasetchanged

我的Android Studio存在问题。首先,我复制BaseAdapter类:

public class AdaptadorGaleriaProductos extends BaseAdapter {

private List<Producto> productosArray = new ArrayList<Producto>();
Context context;
int background;
private AdaptadorBaseDeDatos adapDB;

public AdaptadorGaleriaProductos(Context context, String idCategoria)
{
    super();
    this.context = context;
    //establecemos un marco para las imágenes (estilo por defecto proporcionado)
    //por android y definido en /values/attr.xml
    TypedArray typedArray = context.obtainStyledAttributes(R.styleable.Gallery1);
    background = typedArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 1);
    typedArray.recycle();

    crearAdaptadorDB();
    Cursor productos;
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
    boolean conCero = sp.getBoolean("productosCero", false);

    if (conCero) {
        productos = adapDB.obtenerProductosPorCategoriaConCero(idCategoria);
    } else {
        productos = adapDB.obtenerProductosPorCategoria(idCategoria);
    }

    while (productos.moveToNext()) {
        String id = productos.getString(0);
        String nombre = productos.getString(1);
        String codigo = productos.getString(2);
        int cantidad = productos.getInt(3);
        double precioMinorista = productos.getDouble(4);
        double precioMayorista = productos.getDouble(5);
        String foto = productos.getString(6);
        String descripcion = productos.getString(7);
        Producto prod = new Producto(id, nombre, codigo, cantidad, precioMinorista, precioMayorista, foto, descripcion);
        productosArray.add(prod);
    }
}

@Override
public int getCount()
{
    return productosArray.size();
}

@Override
public Producto getItem(int position)
{
    return productosArray.get(position);
}

@Override
public long getItemId(int position)
{
    return getItem(position).getCodigoHash();
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    ImageView imagen = new ImageView(context);

    final Producto item = getItem(position);
    try {
        Glide.with(imagen.getContext())
                .load(item.getIdImagen())
                .into(imagen);
    } catch(Exception e) {
    }

    //se aplica el estilo
    imagen.setBackgroundResource(background);

    return imagen;
}

活动:

public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_galeria_productos);
    TypedArray typedArray = this.obtainStyledAttributes(R.styleable.Gallery1);
    background = typedArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 1);
    typedArray.recycle();
    String idCategoria = getIntent().getStringExtra(EXTRA_PARAM_ID);
    adapGaleriaProductos = new AdaptadorGaleriaProductos(this, idCategoria);
    imagenSeleccionada = (ImageView) findViewById(R.id.seleccionada);

    gallery = (Gallery) findViewById(R.id.gallery);
    gallery.setAdapter(adapGaleriaProductos);

}

public void eliminarProducto(final AdaptadorGaleriaProductos adap) {
    crearAdaptadorDB();
    this.adapDB.eliminarProducto(adap.getItem(this.savePosition).getId());
    adap.notifyDataSetChanged();
}

删除产品时,活动不会更新。我必须出去重新进入才能看到变化。如您所见,我已尝试使用notifyDataSetChanged(),但它不起作用。

谢谢!

1 个答案:

答案 0 :(得分:1)

notifyDataSetChanged()不起作用的主要原因是列表中没有对适配器的引用

当您致电setAdapter时,您的列表(此处的图库)将保留对适配器的引用以便稍后访问它,当您运行MyAdapter.notifyDataSetChanged()方法时,仅当{{1}时才会通知列表object是您传递给MyAdapter方法

的对象

在您的代码MyList.setAdapter()中必须是adap对象

要避免此问题,请确保仅在全局声明列表时重新初始化列表并修改列表本身中的数据并使用列表中的适配器对象引用