Android - второй опыт


Написал вторую программку под Android - сборник цитат и афоризмов. В этот раз столкнулся только с двумя проблемами: SimpleAdapter и проверка состояния сетевого подключения.


SimpleAdapter

Есть список авторов цитат, который загружается с удаленного сайта в формате xml: 
<authors>
  <author>
    <id/> 
    <name/>
    <link_to_image/>
    <quote/>
  </author>
</authors>
т.е. имя автора, ссылка на аватар и его последняя (новая) цитата. Все это надо отобразить в ListView так, чтобы в каждой строке были и имя автора и его аватар и цитата. 
Разбираем данные из xml (ради экономии места обработку исключений пропускаем):

HttpResponse resp = client.execute(request);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(resp.getEntity().getContent());
doc.getDocumentElement().normalize();
Author.AUTHORS = new ArrayList<HashMap<String, Object>>();
Author.AVATARS = new HashMap<String, Object>();
NodeList idList = doc.getElementsByTagName("id");
NodeList nameList = doc.getElementsByTagName("name");
NodeList quoteList = doc.getElementsByTagName("quote");
NodeList imageList = doc.getElementsByTagName("link_to_image");
HashMap<String, Object> hm;
for (int a = 0; a < idList.getLength(); a++) {
  Integer author_id = new Integer( idList.item(a).getFirstChild().getNodeValue(););
  String author_name = nameList.item(a).getFirstChild().getNodeValue();
  String author_quote = quoteList.item(a).getFirstChild().getNodeValue();
  String author_image = imageList.item(a).getFirstChild().getNodeValue();  
  hm = new HashMap<String, Object>();
  hm.put("id", author_id);
  hm.put("name", author_name);
  hm.put("quote", author_quote);
  hm.put("avatar", author_image);
  Author.AUTHORS.add(hm);  
  URL image_url = new URL(author_image );
  URLConnection conn = image_url.openConnection();
  conn.connect();
  InputStream is = conn.getInputStream();
  Bitmap bm = BitmapFactory.decodeStream(is);
  Author.AVATARS.put(author_image, bm);
}

Теперь Author.AUTHORS содержит данные из xml-файла, а в Author.AVATARS хранятся битмап-изображения авторов (можно, конечно, загружать их на лету - при просмотре списка, но отображаться такой список будет очень медленно).
Настраиваем ListView. Первым делом создаем layout для строк списка - authors_list_item.xml:
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal">

  <ImageView
    android:id="@+id/avatar" />
  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

 <TextView
            android:id="@+id/quote"
            android:layout_width="fill_parent"
   android:layout_height="wrap_content" />

 <TextView
            android:id="@+id/name"
            android:layout_width="fill_parent"
   android:layout_height="wrap_content" />
  </LinearLayout>
</LinearLayout>
Создаем SimpleAdapter для списка авторов:
public class AuthorSimpleAdapter extends SimpleAdapter {
  public AuthorSimpleAdapter(Context context,
          List<? extends Map<String, ?>> data,
          int resource, String[] from, int[] to)
  {
     super(context, data, resource, from, to);
   }
  @Override
   public void setViewImage(ImageView v, String value) {
        super.setViewImage(v, value);
Bitmap bm = (Bitmap) Author.AVATARS.get(value);
v.setImageBitmap(bm);
   }
}
И осталось только назначить AuthorSimpleAdapter списку авторов:
final ListView authorsList = (ListView) findViewById(R.id.listView1);
SimpleAdapter adapter = new AuthorSimpleAdapter (this, Author.AUTHORS,
    R.layout.authors_list_item, new String[] { "quote", "name", "avatar" },
    new int[] { R.id.quote, R.id.name, R.id.avatar });
authorList.setAdapter(adapter);
Все!

Проверка сетевого подключения

Сетевое подключение проверяется просто:

ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo netInfo = conMgr.getActiveNetworkInfo();if (netInfo != null && netInfo.isConnected()) {  // success!}
Проблема возникла только с обработкой этого запроса в эмуляторе, где оно постоянно возвращало true,  даже при выдернутом кабеле. Чтобы получить false нужно сделать следующее:
1. Window -> ShowView -> Other -> Android -> Devices.
2. Запускаем эмулятор.
3. Window -> ShowView -> Other -> Android -> Emulator Control.
4. Telephony Status: выбираем unregistered в списке Data.

Загрузить сборник цитат и афоризмов - бесплатно и без рекламы - можно здесь -  Говорун - цитаты и афоризмы.

Буду признателен за звездочки и комментарии)


Комментарии

Популярные сообщения из этого блога

Конвертируем Ruby-приложение в exe

JQuery и Rails - делаем кнопку "like it" со счетчиком

Резервное копирование базы данных по расписанию