自定义BaseAdapter在恢复应用后不会调用getView

时间:2014-09-09 08:45:57

标签: android listview baseadapter

我遇到了一个自定义BaseAdapter的问题,它在PullToRefreshListView中显示(whitch是ListView的扩展,您可以通过拉动列表来更新)。

我的问题是,当我最小化并且稍后我恢复我的应用程序时,ListView没有显示任何内容...我在我的最后一行代码中有一个断点,我的方法getCount从我的适配器返回总是大于零,但是getView仍未被调用...

适配器:

package extrasoftware.triptreat.Adapters;

/**
 * Creado pormsolla on 7/01/14.
 */

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Point;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.GregorianCalendar;

import extrasoftware.triptreat.Clases.ImageLoader;
import extrasoftware.triptreat.Clases.ImageViewEscalable;
import extrasoftware.triptreat.Clases.Ofertas.Oferta;
import extrasoftware.triptreat.Clases.Ofertas.OfertasLlenar_R;
import extrasoftware.triptreat.Comun.Constantes;
import extrasoftware.triptreat.Comun.Datos;
import extrasoftware.triptreat.Comun.General;
import extrasoftware.triptreat.OfertasActivity;
import extrasoftware.triptreat.OfertasDetalleActivity;
import extrasoftware.triptreat.R;

public class OfertasAdapter extends BaseAdapter {
    private Activity activity;
    private OfertasLlenar_R oRespuesta;
    private OfertasLlenar_R oRespuestaTotal;
    private static LayoutInflater inflater = null;
    private ImageLoader imageLoader;

    public static boolean abrirVentana = true;
    //public static boolean okComentario = true;

    public OfertasAdapter(Activity a, OfertasLlenar_R d, OfertasLlenar_R d_total) {
        activity = a;
        oRespuesta = d;
        oRespuestaTotal = d_total;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        Display display = activity.getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);

        imageLoader = new ImageLoader(activity.getApplicationContext(), R.drawable.sinimagen, Constantes.ImageLoaderTipo.Lista);

    }


    public int getCount() {
        return oRespuesta.datos.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }


    public View getView(final int position, View convertView, ViewGroup parent) {
        View vista = convertView;

        try{
            vista = inflater.inflate(R.layout.ofertas_row, parent, false);

            final Oferta oferta = oRespuesta.datos.get(position);    
            final TextView txtTitulo = (TextView)vista.findViewById(R.id.txtTitulo);
            final TextView txtNegocio = (TextView)vista.findViewById(R.id.txtNegocio);                
            final ImageViewEscalable imgOferta = (ImageViewEscalable)vista.findViewById(R.id.imgOferta);
            final ImageView imgEstado = (ImageView)vista.findViewById(R.id.imgEstado);
            imgOferta.setImageBitmap(null);

            String urlImagen = General.ObtenerRutaImagen(Constantes.Ventanas_Origen.Ofertas, oRespuesta.oferta_raiz + "/" + oferta.oferta_imagen, activity);
            imageLoader.DisplayImage(urlImagen, imgOferta);

            txtNegocio.setText(oferta.negocio_nombre);
            txtTitulo.setText(oferta.titulo);

            GregorianCalendar calendar = new GregorianCalendar();

            final boolean caducada = calendar.getTime().after(oferta.valido_hasta_F);
            if(caducada){
                imgEstado.setImageResource(R.drawable.caducada);
            }
            else if(oferta.estado == Constantes.Ofertas_Estados.Aceptada){
                imgEstado.setImageResource(R.drawable.aceptada);
            }
            else if(oferta.estado == Constantes.Ofertas_Estados.Usada){
                imgEstado.setImageResource(R.drawable.usada);
            }
            else{
                imgEstado.setVisibility(View.GONE);
            }


            vista.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(final View v) {
                    final CharSequence[]
                        options = {
                        activity.getResources().getString(R.string.borrar),
                        activity.getResources().getString(R.string.excluir),
                        activity.getResources().getString(R.string.cancelar)
                    };

                    AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                    builder.setItems(options, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int item) {
                            if (options[item].equals(activity.getResources().getString(R.string.borrar))) {
                                OfertasActivity.ConfirmarBorrar(v, oferta.oferta_id);
                            }
                            else if (options[item].equals(activity.getResources().getString(R.string.excluir))) {
                                OfertasActivity.ConfirmarExcluir(v, oferta.negocio_id, oferta.negocio_nombre);
                            }
                            else if (options[item].equals(activity.getResources().getString(R.string.cancelar))) {
                                dialog.dismiss();
                            }
                        }
                    });
                    builder.show();

                    return true;
                }
            });


            // Click event for single list row
            vista.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try{
                        if(abrirVentana && !caducada){
                            abrirVentana = false;
                            General.MostrarCargando(activity);
                            Datos.setCodigosFiltrados(activity.getApplicationContext(), oRespuesta);
                            Intent detalleIntent = new Intent(activity.getApplicationContext(), OfertasDetalleActivity.class);
                            detalleIntent.putExtra(Constantes.Parametros_Extra.Indice, String.valueOf(General.ObtenerIndiceOfertaEnLista(oRespuesta.datos, oferta.oferta_id)));
                            activity.startActivity(detalleIntent);
                        }
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
        catch(Exception e){
            e.printStackTrace();
        }

        return vista;
    }

    public void setDatos(OfertasLlenar_R oRespuestaFiltro){
        oRespuesta = oRespuestaFiltro;
        this.notifyDataSetChanged();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚在使用此适配器的活动中发现错误...但我不明白这一点,我不确定它是更好的解决方案...... 这个方法就是问题:

private static void CargarListasOfertas(OfertasLlenar_R oRespuesta){
    try{
        OfertasLlenar_R oRespuestFiltradas = (OfertasLlenar_R) oRespuesta.clone();

        if(m_listaNavegaciones != null && m_listaNavegaciones.size() != 0){
            final short paisID = m_listaNavegaciones.get(m_indice_actual).pais_id;
            final short ciudadID = m_listaNavegaciones.get(m_indice_actual).ciudad_id;

            Predicate<Oferta> ofertasPredicate = new Predicate<Oferta>() {
                public boolean apply(Oferta oferta) {
                    return oferta.pais_id == paisID && oferta.ciudad_id == ciudadID;
                }
            };
            Collection<Oferta> ofertas = General.Filtrar(oRespuestFiltradas.datos, ofertasPredicate);

            oRespuestFiltradas.datos = new ArrayList<Oferta>(ofertas);

            if(adapterOfertas == null){
                adapterOfertas = new OfertasAdapter(activity, oRespuestFiltradas, oRespuesta);
                lstOfertas.setAdapter(adapterOfertas);
            }
            else{
                adapterOfertas.setDatos(oRespuestFiltradas);
            }

        }
        else{

            oRespuestFiltradas.datos = new ArrayList<Oferta>();
            if(adapterOfertas == null){
                adapterOfertas = new OfertasAdapter(activity, oRespuestFiltradas, oRespuesta);
                lstOfertas.setAdapter(adapterOfertas);
            }
            else{
                adapterOfertas.setDatos(oRespuestFiltradas);
            }

            oRespuestFiltradas.datos = new ArrayList<Oferta>();
        }

        final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs
        long t = Calendar.getInstance().getTime().getTime();
        Date afterAddingTenMins = new Date(t + (10 * ONE_MINUTE_IN_MILLIS));

        if(Datos.ventana_origen != Constantes.Ventanas_Origen.OfertasDetalle
                || (OfertasDetalleActivity.getFechaCarga() != null
                && !OfertasDetalleActivity.getFechaCarga().before(afterAddingTenMins))){
            m_posicionOfertas = lstOfertas.getRefreshableView().getFirstVisiblePosition();
        }

        if(m_posicionOfertas != -1){
            lstOfertas.getRefreshableView().setSelection(m_posicionOfertas);
        }

        General.OcultarCargando();
    }
    catch (Exception e){
        e.printStackTrace();
        General.OcultarCargando();
    }
}

现在正常运行的代码是:

    private static void CargarListasOfertas(OfertasLlenar_R oRespuesta){
    try{
        OfertasLlenar_R oRespuestFiltradas = (OfertasLlenar_R) oRespuesta.clone();

        if(m_listaNavegaciones != null && m_listaNavegaciones.size() != 0){
            final short paisID = m_listaNavegaciones.get(m_indice_actual).pais_id;
            final short ciudadID = m_listaNavegaciones.get(m_indice_actual).ciudad_id;

            Predicate<Oferta> ofertasPredicate = new Predicate<Oferta>() {
                public boolean apply(Oferta oferta) {
                    return oferta.pais_id == paisID && oferta.ciudad_id == ciudadID;
                }
            };
            Collection<Oferta> ofertas = General.Filtrar(oRespuestFiltradas.datos, ofertasPredicate);

            oRespuestFiltradas.datos = new ArrayList<Oferta>(ofertas);
        }
        else{
            oRespuestFiltradas.datos = new ArrayList<Oferta>();
        }
        adapterOfertas = new OfertasAdapter(activity, oRespuestFiltradas, oRespuesta);
        lstOfertas.setAdapter(adapterOfertas);

        final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs
        long t = Calendar.getInstance().getTime().getTime();
        Date afterAddingTenMins = new Date(t + (10 * ONE_MINUTE_IN_MILLIS));

        if(Datos.ventana_origen != Constantes.Ventanas_Origen.OfertasDetalle
                || (OfertasDetalleActivity.getFechaCarga() != null
                && !OfertasDetalleActivity.getFechaCarga().before(afterAddingTenMins))){
            m_posicionOfertas = lstOfertas.getRefreshableView().getFirstVisiblePosition();
        }

        if(m_posicionOfertas != -1){
            lstOfertas.getRefreshableView().setSelection(m_posicionOfertas);
        }

        General.OcultarCargando();
    }
    catch (Exception e){
        e.printStackTrace();
        General.OcultarCargando();
    }
}