Blog

  • Обновление ListView в Android

    Мейнстрим решением для обновления ListView после изменения данных является использование метода arrayAdapter.notifyDataSetChanged(), где arrayAdapter – Ваш адаптер. Но к сожалению, это не всегда срабатывает.

    Я использовал в своем случае другое решение, которое сработало – просто переопределял адаптер целиком. Теперь таблица обновляется после изменения данных в массиве, с которым она связана.

    private ArrayAdapter arrayAdapter;
    arrayAdapter = new ArrayAdapter
    (this, R.layout.list_item, diseasesArray);
    setListAdapter(arrayAdapter);
    //
    //Здесь код по обновлению данных в diseaseArray
    //
    arrayAdapter = new ArrayAdapter
    (DiseaseActivity.this, R.layout.list_item, diseasesArray);
    setListAdapter(arrayAdapter);
    
  • Парсим XHTML с помощью JSoup в Android

    Расскажу о том, как можно распарсить XHTML или даже HTML с помощью JSoup в Android. Лично я парсил XHTML. Для этого нужно:

    1. Скачать jar файл JSoup библиотеки здесь.
    2. Подключить JSoup.jar к нашему проекту. Для этого нажимаем правой кнопкой на проект, далее выбираем Build Path->Configure Build Path.

      В появившемся окне нажимаем Java Build Paths, далее выбираем вкладку Libraries и добавляем через Add Jars.
    3. Создать объект класса Document, который, кстати, должен быть именно из Jsoup библиотеки, а не родных библиотек. Это можно выбрать при нажатии Shift+Cmd+O после того, как вы добавили код, использующий JSoup. Объект класса Document в данном случае создается из того, что подкачивается через URL. Далее с этим объектом можно работать. Например, в данном случае из него извлекаются все ссылки с тэгом а, и создается массив из ссылок и их атрибутов href. Сначала все добавляем в структуру ArrayList, затем ArrayList заносим в String[] массив. Все, что добавлено, пишется в LogCat через Log.v. В данном случае, метод doInBackground должен быть в составе класса AsyncTask, просто не хочу приводить весь код, это будет лишним.
      private static final String TAG = "DiseaseActivity";
      private ArrayList<String> diseasesList = new ArrayList<String>();
      private ArrayList<String> linksList = new ArrayList<String>();
      	
      private String[] diseasesArray = new String[]{"Загрузка болезней"};
      private String[] linksArray = new String[]{"Ссылка"};
      
      public static String[] ConvertToStringArray(ArrayList list)
          {
              return (String[])list.toArray(new String[0]);
          }
      
      protected Void doInBackground(String... urls) {
                  try 
                  {
                  	String urlString = urls[0];
                      Document doc = Jsoup.connect(urlString).get();
                      Elements links = doc.select("a");
                      diseasesList.clear();
                      linksList.clear();
                      for (Element link : links) {
                      		diseasesList.add(link.text());
                      		linksList.add(link.attr("href"));
                      		Log.v(TAG, e.text());
                      }
                      diseasesArray = ConvertToStringArray(diseasesList);
                      linksArray = ConvertToStringArray(linksList);
                  } 
                  catch (ClientProtocolException e) 
                  {
                      Error = e.getMessage();
                      cancel(true);
                  } 
                  catch (IOException e) 
                  {
                      Error = e.getMessage();
                      cancel(true);
                  }
                  return null;
              }
      

    Это лишь один из примеров использования JSoup. Возможностей у него много и здесь можно найти более подробное их описание.

  • Интернет через Proxy на симуляторе Android

    В отличие от симулятора iPhone, эмулятору Android нужно объяснять, как ему выходить в интернет. Здесь речь пойдет о случае, когда вы работаете через Proxy.

    Неработоспособность интернета на эмуляторе Android – общая проблема и широко обсуждается на StackOverflow. Я задал также свой вопрос там, но мне не смогли помочь, в итоге я сам же и ответил на свой вопрос.

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

    Итак, последовательность действий, чтобы интернет у Вас заработал:

    • В Eclipse заходим в Run Configurations. См. рисунок. При нажатии он увеличивается.
    • Нажимаем на Target для нашего проекта. Прокручиваем вниз и вводим настройку Proxy в поле Additional Emulator Command Line Options. Я не знал, что нужно прокручивать, и искал это поле очень долго. В случае использования эмулятора версии 2.3.3. вводим
      -dns-server 8.8.8.8 -http-proxy 172.28.111.1:3128
      

      Если вы используете эмулятор версии 4.0.3, то dns указывать не надо:

      -http-proxy 172.28.111.1:3128
      

    • Нажимаем Apply, чтобы сохранить настройки и либо нажимаем Run здесь, либо просто запускаем проект как обычно. Обращаю внимание, что для дебага нужно прописать отдельно это же в Debug Configurations.

    Данное решение хорошо тем, что оно не зависит от симулятора и настройки хранятся в Target в проекте, а не вне проекта. Но оно плохо тем, в отличие от решения которое я указал ранее, что нужно все время прописывать эти настройки для всех проектов и всех конфигураций.

  • Page Up и Page Down на Макбуках

    Заменой клавишам PageUp и PageDown на MacBook Pro является сочетание клавиш Fn+Вверх, Fn+Вниз.

    Кроме этого, листать страницы можно вниз и вверх клавишей пробел и Shift+пробел.

  • SVN в Windows

    Я решил начать использовать SVN на локальной машине для управления версиями своих Windows-приложений. На эту тему написано уже немало статей, но я сделал не так, как в них написано. Прочитал 2-3 статьи на русском языке и пару статей на английском. Ничего не получалось, тогда я нашел ответ, в котором писалось про VisualSVN. Все у меня получилось с ним и хочу поделиться тем, как. Я не пишу здесь про основы SVN, о том, что это, что такое рабочая копия и т.д. Лучше со всем этим предварительно ознакомиться, чтобы не делать без понимания.

    Итак, опишу по шагам, что нужно сделать, чтобы настроить SVN на своем компьютере.

    1. Скачиваем и устанавливаем VisualSVN – это серверная часть
    2. Скачиваем и устанавливаем TortoiseSVN – клиентская часть
    3. Запускаем VisualSVN. Нажимаем правой кнопкой на Repositories и выбираем Create New Repository. Если рисунок не понятен, просто кликните на нем и он откроется в увеличенном виде.
    4. Даем название, ставим галочку и копируем куда-нибудь в блокнот URL. Он нам дальше пригодится. Можно и не копировать, есть специальная функция, которая затем нам этот URL будет возвращать. Если порт 443 занят, используем 8443. Это TCP порт HTTPS по умолчанию.
    5. Находим папку с нашим проектом, который мы хотим импортировать в репозиторий. Нажимаем правой кнопкой на нем, выбираем TortoiseSVN->Import и указываем для импорта URL репозитория, который мы сохранили при его создании. Если не сохранили, то идем в репозиторий, нажимаем правой кнопкой на нем в VisualSVN и выбираем Copy URL to ClipBoard. После вставки URL в TortoiseSVN нажимаем Ok. Произошел импорт проекта в репозиторий. При этом может потребоваться создание пользователя. Соглашаемся и создаем его с паролем.
    6. Теперь нужно скопировать рабочую копию из репозитория. Создаем папку для рабочей копии. Нажимаем на ней правой кнопкой и выбираем SVN Checkout. Указываем URL репозитория.
    7. Затем после разработки и доработки точно так же делаем Commit. Если какие-то файлы были удалены или добавлены – тут чуть сложнее. Просто нажимаем правой кнопкой на рабочую копию проекта, выбираем Tortoise SVN->Check for modifications. Далее нажимаем правой кнопкой на соответствующие файлы и выбираем либо Delete, либо Add. После чего делаем Commit.
    8. Если в браузере ввести URL репозитория, можно увидеть, что в нем есть.

    Решение о том, что можно использовать Visual SVN нашел здесь.

  • Использование переменных в Терминале Mac OS X (Bash)

    Иногда приходится иметь дело с определенными папками, которые лежат очень глубоко и было бы хорошо создавать для них псевдонимы, которые можно использовать в других командах, например SVN. Я сначала пытался это сделать через alias, а потом нашел решение через переменные окружения.

    Создать переменную окружения прямо в Терминале можно следующим образом:

    $MooreaFolder=http://xxx.xx.xxx.xx/svn/MooreaClient/MedInfo
    

    Главное – не оставить пробелы вокруг знака равно. Знак доллара дополнительный не нужен, тот, что здесь отображен – это приглашение Терминала. Теперь эту переменную можно использовать в командах, например, SVN:

    Отображаем значение переменной

    $echo $MooreaFolder
    

    Используем в svn checkout

    $svn checkout $MooreaFolder /Users/UserName/Desktop/Android_MEDinfo
    

    Таким образом, мы переносим из MooreaFolder на рабочий стол рабочую копию проекта. Обращаем внимание на то, что перед именем переменной должен стоять знак доллара ($).

    Это все конечно хорошо, а что если нам нужно, чтобы переменная сохранилась и при перезапуске Терминала можно было ей всегда пользоваться? Для этого ее нужно прописать в скрипте автозапуска bash_profile.

    Открываем скрипт:

    $vim ~/.bash_profile
    

    Добавляем в него строку

    MooreaFolder=http://xxx.xx.xxx.xx/svn/MooreaClient/MedInfo
    

    Подробнее о работе с Vim и об этом скрипте можно почитать здесь

    Перезапускаем скрипт вручную, чтобы изменения вошли в силу:

    $source ~/.bash_profile
    

    Аналогичным образом можно создать псевдонимы для любых папок, которые часто используются.

  • Настройка темы WordPress TwentyTen

    Чтобы изменить текст “Continue reading”, надо:

    • Найти файл WordPress/wp-content/themes/twentyten/functions.php
    • Заменить в нем все строки “Continue reading” на нужные
  • О папке drawable в проекте Android приложения

    Есть два аспекта, которые нужно учитывать при работе с папкой drawable в проекте Android приложения: иерархия файлов и их названия.

    Иерархия файлов
    К сожалению, в папке drawable нельзя создавать папки, чтобы упорядочивать xml и png файлы. К примеру, следующая иерархия давала сбой:

    Это привело к тому, что не сгенерировался файл R.java и к соответствующим ошибкам. Таким образом, все файлы должны иметь плоскую иерархию в данной папке.

    Это активно обсуждается здесь:
    http://stackoverflow.com/questions/1077357/can-the-android-drawable-directory-contain-subdirectories

    Разработчики надеются, что Google исправит это в следующей версии Android SDK.

    Названия файлов
    Названия всех файлов должны быть разными, даже если они разных типов – png и xml.
    Например, если у вас есть файл ic_tab_menu.xml, то не должно быть файла ic_tab_menu.png.

  • Препятствия на пути познания

    Препятствия на пути познания по Бэкону:

    Фрэнсис Бэкон разделил источники человеческих ошибок, стоящих на пути познания, на четыре группы, которые он назвал «идолами», (лат. idola). Это «идолы рода», «идолы пещеры», «идолы площади» и «идолы театра».

    «Идолы рода» проистекают из самой человеческой природы, они не зависят ни от культуры, ни от индивидуальности человека. «Ум человека уподобляется неровному зеркалу, которое, примешивая к природе вещей свою природу, отражает вещи в искривлённом и обезображенном виде».

    «Идолы пещеры» — это индивидуальные ошибки восприятия, как врожденные, так и приобретённые. «Ведь у каждого помимо ошибок, свойственных роду человеческому, есть своя особая пещера, которая ослабляет и искажает свет природы».

    «Идолы площади (рынка)» — следствие общественной природы человека, — общения и использования в общении языка. «Люди объединяются речью. Слова же устанавливаются сообразно разумению толпы. Поэтому плохое и нелепое установление слов удивительным образом осаждает разум».

    «Идолы театра» — это усваиваемые человеком от других людей ложные представления об устройстве действительности. «При этом мы разумеем здесь не только общие философские учения, но и многочисленные начала и аксиомы наук, которые получили силу вследствие предания, веры и беззаботности».

  • Горячие клавиши Eclipse Helios

    Полезные, часто используемые и интересные горячие клавиши Eclipse:

    Cmd+O – открывает так называемый Outline, то есть список всех методов, постоянных и классов. Причем курсор размещается сразу в строке поиска – Вы можете начать вводить букву f и получите отфильтрованный список всего на эту букву. Затем нажав на элемент списка можете перейти куда Вам нужно. Если еще раз нажать это сочетание, то Вы получите список всех вложенных членов классов или методов.

    Cmd+T – аналогичным образом показывает иерархию типов. Что интересно, можно нажать на кнопку справа вверху в этом окне и переместить его используя функцию Move. Затем можно сохранить точно так же положение этого окна и оно будет всегда показываться там, где Вам удобно с тем размером, который Вам нравится.

    Cmd+Shift+O – добавляет все используемые недостающие библиотеки автоматически, то есть дописывает все необходимые import строки.

    Cmd+Shift+L – просмотр горячих клавиш. Повторное нажатие открывает настройки горячих клавиш.

    Debug and Run:

    fn+Cmd+F11 – Debug

    fn+Shift+Cmd+F11 – Run

    fn+F8 – Resume (продолжить дебаггинг)

    fn+F5 – Step Into

    fn+F6 – Stop Out

    fn+Cmd+F2 – Terminate

    Text Editing:

    Cmd+D – Удалить строку

    Cmd+I – Поправить Intendation

    Cmd+/ – Закомментировать строку (при этом можно закомментировать несколько строк так же)

    Cmd+Shift+/ – Убрать комментирование строки

    Cmd+\ – Закомментировать блок

    Cmd+Shift+\ – Убрать комментирование блока

    Shift+Cmd+S – Сохранить все

    Cmd+1 – Быстрое исправление (магическое заклинание – предлагает свои варианты для исправления)

    Cmd+F – Find&Replace

    Cmd+K – Find Next (диалоговое окно Find при этом должно быть закрыто)