GridView не показывает изображения в первый раз

У меня есть GridView, который я использую для создания галереи, но у меня возникла проблема, заключающаяся в том, что изображения не отображаются при первом вызове действия галереи, но если я нажму кнопку «Назад», а затем снова открою действие, представление сетки покажет изображения (если повернуть экран, изображения тоже отображаются). Я получаю изображения, загруженные с URL-адресов.

Вот код галереи:

public class Galeria extends ActionBarActivity {

    private AdapterGaleria adapter;
    private ArrayList<Foto> fotos;
    private GridView grid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_galeria);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.actionbar_background));
        getSupportActionBar().setIcon(getResources().getDrawable(R.drawable.icon));

        Bundle b = getIntent().getExtras();

        final Fotos fts = (Fotos)b.getSerializable("photos");

        fotos = ((Fotos)b.getSerializable("photos")).getFotos();
        grid = (GridView)findViewById(R.id.grid_galeria);
        adapter = new AdapterGaleria(getApplicationContext(), R.layout.item_galeria, fotos);
        grid.setAdapter(adapter);
        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                Intent it = new Intent(Galeria.this, GaleriaAberta.class);
                it.putExtra("position", position);
                it.putExtra("photos", fts);
                startActivity(it);

            }
        });
    }
}

А это код адаптера:

public class AdapterGaleria extends ArrayAdapter<Foto>{

    private LayoutInflater inflater;
    private Context context;
    private ArrayList<Foto> imagesToLoad;

    public AdapterGaleria(Context context, int resource, List<Foto> objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        inflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        this.imagesToLoad = (ArrayList<Foto>)objects;
        this.context = context;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return imagesToLoad.size();
    }

    @Override
    public Foto getItem(int position) {
        // TODO Auto-generated method stub
        return imagesToLoad.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class ViewHolder{

        ImageView image;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.d("GET_VIEW", "get_view");
        Foto f = new Foto();
        f = getItem(position);
        ViewHolder holder;
        View v;
        v = convertView;
        if (v == null){
            holder = new ViewHolder();
            v = inflater.inflate(R.layout.item_galeria, parent, false);
            holder.image = (ImageView)v.findViewById(R.id.image_galeria);
            v.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }

        AQuery aq = new AQuery(context);
        aq.id(holder.image).image(imagesToLoad.get(position).getNormal(), true, false, 300, 0, null,0,1.0f / 1.0f);

        return v;
    }

}

person WitaloBenicio    schedule 22.07.2014    source источник
comment
вызывается ли метод onCreate() в первый раз, когда он не отображается? то же самое для getView()?   -  person Al Lelopath    schedule 22.07.2014
comment
Да, оба метода вызываются. Если я просто поверну экран или нажму назад и снова открою галерею, это сработает. Я думаю, что это должно быть что-то при асинхронной загрузке.   -  person WitaloBenicio    schedule 22.07.2014
comment
Да, оба метода вызываются. Если я просто поверну экран или нажму назад и снова открою галерею, это сработает. Я думаю, что это должно быть что-то при асинхронной загрузке.   -  person WitaloBenicio    schedule 22.07.2014


Ответы (2)


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

public class AdapterGaleria extends ArrayAdapter<Foto>{

    private LayoutInflater inflater;
    private Context context;
    private ArrayList<Foto> imagesToLoad;
    private int resource;

    public AdapterGaleria(Context context, int resource, List<Foto> objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        inflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        this.imagesToLoad = (ArrayList<Foto>)objects;
        this.context = context;
        this.resource = resource;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return imagesToLoad.size();
    }

    @Override
    public Foto getItem(int position) {
        // TODO Auto-generated method stub
        return imagesToLoad.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class ViewHolder{

        ImageView image;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.d("GET_VIEW", "get_view");
        Foto f = new Foto();
        f = getItem(position);
        ViewHolder holder;
        View v;
        v = convertView;
        if (v == null){
            holder = new ViewHolder();
            v = inflater.inflate(resource, parent, false);
            holder.image = (ImageView)v.findViewById(R.id.image_galeria);
            v.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }

        AQuery aq = new AQuery(context);
        aq.id(holder.image).image(imagesToLoad.get(position).getNormal(), true, false, 300, 0, null,0,1.0f / 1.0f);

        return v;
    }

}
person Sweety Bertilla    schedule 22.07.2014
comment
попробуйте AQuery aq = новый AQuery (v); - person Sweety Bertilla; 22.07.2014
comment
Все еще с той же проблемой. :( - person WitaloBenicio; 22.07.2014

Мне просто нужно передать предварительно загруженное изображение в представление до того, как AQuery завершит загрузку, а затем, когда загрузка будет завершена, изображения будут отображаться в представлении сетки. :)

person WitaloBenicio    schedule 22.07.2014