Создавать галерею фотографий android

Мне хотелось бы мочь разрабатывать активность, которая соглашается на папку с фотографиями и создает галерею, чтобы мочь отображать их. Я думаю, что у меня есть практически каждый факт, но чем-нибудь в этом роде оно не заканчивает быть увиденным хорошо.

Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.oftecnica2.agendajose.GaleriaFotos"
    android:orientation="vertical">

    <Gallery
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/galeria" />

    <ImageView
        android:id="@+id/imagengaleria"
        android:layout_width="133dp"
        android:layout_height="194dp"
        android:layout_gravity="center_horizontal"
        android:background="#cfcfcf"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"/>

</LinearLayout>

класс java:

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

import java.io.File;

public class GaleriaFotos extends AppCompatActivity {

    File[]fotos=null;
    String id="";
    Gallery galeria;
    ImageView imagengaleria;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_galeria_fotos);
        id=getIntent().getExtras().getString("id");
        imagengaleria=(ImageView)findViewById(R.id.imagengaleria);

        cargoLista();

        galeria.setAdapter(new ImageAdapter(this));
        galeria.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                ImageView imagengaleria=(ImageView)findViewById(R.id.imagengaleria);
                Bitmap foto = BitmapFactory.decodeFile(fotos[i].getAbsolutePath());
                imagengaleria.setImageBitmap(foto);

            }
        });
    }

    public void cargoLista(){
        try{
            File fichero=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"Reuniones"+File.separator+String.valueOf(id)+File.separator+"fotos");
            fotos=fichero.listFiles();
            galeria=(Gallery)findViewById(R.id.galeria);
            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            for (File f:fotos){
                System.out.println(f.getAbsolutePath());
            }
        }catch (Exception e){
            System.out.println("NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
        }
    }

    private class ImageAdapter extends BaseAdapter {
        private Context context;
        private int itemBackground;
        public ImageAdapter(Context c)
        {
            context = c;
            // sets a grey background; wraps around the images
            TypedArray a =obtainStyledAttributes(R.styleable.MyGallery);
            itemBackground = a.getResourceId(R.styleable.MyGallery_android_galleryItemBackground, 0);
            a.recycle();
        }
        // returns the number of images
        public int getCount() {
            return fotos.length;
        }
        // returns the ID of an item
        public Object getItem(int position) {
            return position;
        }
        // returns the ID of an item
        public long getItemId(int position) {
            return position;
        }
        // returns an ImageView view
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView = new ImageView(context);
            Bitmap bitmap = BitmapFactory.decodeFile(fotos[position].getAbsolutePath());
            imageView.setImageBitmap(bitmap);
            imageView.setLayoutParams(new Gallery.LayoutParams(100, 100));
            imageView.setBackgroundResource(itemBackground);
            return imageView;
        }
    }
}

Поскольку вы видите, я перемещаю его из-за параметра число, которое является папкой, где - фотографии.

Выполнив это иногда дай типичную ошибку outofmemory и другие он появляется абсолютно совсем не. Кто-то видит ошибки?

7
задан 19.04.2017, 11:34
1 ответ

Тема галерей, созданных начиная с widget Gallery всегда это была проблема, проблемы связаны главным образом, в который изображения, будучи загружен внутри выполнения getView(), они загружены внутри ImageView но когда ImageView он не является видимым эти не освобождены от того же самого, в действительности ты загружаешь изображения и поддерживая их еще, не будучи увиден.

Быстрое решение состоит в том, чтобы удалять изображение ImageView, когда эта увидена посредством setBackgroundDrawable () распределяя ему стоимость null:

miImageView.setBackgroundDrawable(null);

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

Я предлагаю тебе проверить эти tips оптимизации: Хорошее разрешение изображение

и в случае твоей галереи я рекомендую используй Пикассо или Glide внутри

 public View getView(int position, View convertView, ViewGroup parent) {
 ...
 ...

чтобы загружать изображения внутри ImageView, я не состою в том, чтобы рекомендовать книжные магазины, но в этом случае это 2 хороших выбора, которые я рекомендую, в действительности они оптимизируют изображение, которое они загружают внутри ImageView, это заканчивается низким потреблением памяти, которое предотвращало проблемы, связанные в OutofMemory.

2
ответ дан 24.11.2019, 13:38
  • 1
    нет способа это получать... я попытаюсь с экспертом cardview в recycler view... они могут закрывать вопрос, спасибо за Ваши ответы: ( – Sergio Cv 17.08.2016, 09:15
  • 2
    Используя picasso я думаю, что он может реализовывать работу, уже ты это осуществил? – Jorgesys♦ 17.08.2016, 11:24
  • 3
    Добавь твое сообщение LogCat, потому что могла быть другой причина. – Jorgesys♦ 17.08.2016, 11:25
  • 4
    Я попытался с Пикассо и галерея оставалась, не будучи виден... Выбор, через который я достиг ее, состоит в том, чтобы использовать recuclerview с picasso redimensionandolas, так идет очень жидкий. – Sergio Cv 17.08.2016, 11:30
  • 5
    Правильный Елена, они не были увидены. Но если, может быть, лучше для управления памяти использование recyclerview. Спасибо за твою помощь, приветствие:) – Sergio Cv 17.08.2016, 12:13