2015-03-27 3 views
0

Я довольно новичок в Android, и я столкнулся с первой проблемой, с которой я не могу найти прямой ответ. Вот моя проблема:Каков наилучший способ хранения/заполнения изображений для Android-приложения?

Мое приложение будет использовать список элементов, с изображениями для каждой строки списка, и при нажатии на него будет отображаться одно и то же изображение и дополнительная информация об элементе. Тем не менее, может быть где угодно от 100-500 (или более) изображений, которые нужно будет показать. Я тестировал только мое приложение с 6 предметами, поэтому память не является проблемой в настоящее время, но когда я обсуждал свое приложение с другом, он сделал предложение по размещению изображений на хостинге изображений сайта и используя URL-адреса для их ссылки.

Мой вопрос: будет ли метод ссылок URL лучшим решением для большого количества изображений, или было бы лучше сделать это по-другому?

Если на это был дан ответ, и я просто пропустил его во время поиска, я извиняюсь и прошу вас указать мне в правильном направлении.

Спасибо.

ответ

0

Я рекомендовал бы использовать 2 вещи. Первый - это LruCache для хранения каждого растрового изображения (см. http://developer.android.com/reference/android/util/LruCache.html). Это позаботится о том, нужно ли вам перезагружать растровое изображение с диска или нет для вас. Вторая вещь, которую вы должны сделать, это иметь ListView с пользовательским адаптером, чтобы служить ваши взгляды, поэтому он может перерабатывать их (Вместо того, чтобы просто имея LinearLayout в ScrollView или что-то). Адаптер работает, принимая существующее представление и просто устанавливая контент для определенного индекса. Например, если у вас есть массив элементов, и каждый элемент имеет изображение и текст для отображения, вы должны создать адаптер , который имеет список элементов и установить его на ListView. ListView отслеживает, какие элементы отображаются, и вызывает getView (int position, View convertView, родительская группа ViewGroup) для каждого. Если представление уже существует для этого типа элемента в этой позиции, то переданное в convertView будет представлением, которое в настоящее время не используется. В этом случае просто установите изображение и текст на нем. Если это значение равно null, значит, все доступные виды используются, поэтому вам нужно раздуть новый. В этом случае раздуйте его, затем установите на нем изображение/текст.

Например, ваш адаптер может выглядеть следующим образом:

public class MyListAdapter extends BaseAdapter { 
    public class MyListItem { 
     String ImagePath; 
     String Text; 
    } 

    ArrayList<MyListItem> mItems; 
    LayoutInflater mInflater; 
    Context mContext; 

    public MyListAdapter(Context context, ArrayList<MyListItem> items) { 
     mItems = items; 
     mContext = context; 
     mInflater = LayoutInflater.from(mContext); 
    } 

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

    @Override 
    public MyListItem getItem(int position) { 
     return mItems.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // If you have more than 1 type of view, give each an ID 
     // and return the ID for the view you want to display 
     // at this position in the array list. 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.SOME_VIEW_ID, null); 

      // Perhaps set some layout parameters on convertView. 
     } 

     // Get the item at this position 
     MyListItem item = getItem(position); 

     // Set properties on the convertView here 
     // For the sake of example, pretend we have a View class 
     // called "ExampleView" with setImagePath and setText methods. 
     // setImagePath could lookup the path in an LruCache and load it 
     // it from disk if it isn't in there. 
     ExampleView someCustomView = (ExampleView)convertView; 
     someCustomView.setImagePath(item.ImagePath); 
     someCustomView.setText(item.Text); 

     return convertView; 
    } 
} 
+0

У меня уже есть настраиваемая настройка адаптера для списка, но я думаю, мне нужно немного изменить его. Но мне было просто интересно, будет ли хранить почти 500 изображений в папке с возможностью переноса. Я никогда не добавлял приложение на рынок, и я не знаю, что такое максимальный размер для приложения, и я не хочу занимать много памяти на чьем-то устройстве. Но я буду использовать ваш пример кода в качестве ссылки, когда я перехожу к настройке адаптера. – user2540528

+0

500 изображений в папке с рисунком должны быть в порядке с точки зрения Android. Если вы хотите, чтобы папки были организованы, то, что я сделал в другом проекте, когда у меня было множество файлов, система сборки зашифровала его в «res/raw/resources.zip», а затем извлекла его во внешнюю память при первом запуске. Он также поддерживал хэш, поэтому он мог проверять каждую сборку, если ей нужно было повторно извлечь ее или нет. Максимальный размер в Play Store для APK составляет 50 МБ. У них есть механизм для загрузки до 2 ГБ дополнительных данных после установки (см. Http://developer.android.com/google/play/expansion-files.html) – Jim

+0

Интересно. Я думал, что это будет слишком много для этого. Я рассмотрю метод zip и посмотрю, как это происходит. Я ценю помощь. – user2540528

0

Я думаю, что «ссылка на URL» - хорошая идея. Не беспокойтесь в большом количестве изображений. Он не будет использовать слишком много памяти, потому что ListView (или RecyclerView) кэширует разные виды. В списке вы можете показывать некоторые меньшие iamges (например, 100x100), но в другой деятельности вы можете показать изображение реального размера. Это не то же изображение, есть два изображения.

Вы можете посмотреть эти библиотеки:

Android-Universal-Image-Loader

Picasso

Glide

+0

Я думал об использовании UIL, но пытается найти способ сделать это без него. Я загрузил пакет кода в качестве резервной копии. – user2540528

+0

Я вижу. Почти все библиотеки решают проблему с ссылкой на URL.Вы можете проверить их код и найти новый способ. Я думаю, что ссылочный метод URL-адресов в общем использовании. Я обращу внимание на проблему. –

Смежные вопросы