Android - второй опыт
Написал вторую программку под Android - сборник цитат и афоризмов. В этот раз столкнулся только с двумя проблемами: SimpleAdapter и проверка состояния сетевого подключения.
SimpleAdapter
Есть список авторов цитат, который загружается с удаленного сайта в формате xml:<authors>т.е. имя автора, ссылка на аватар и его последняя (новая) цитата. Все это надо отобразить в ListView так, чтобы в каждой строке были и имя автора и его аватар и цитата.
<author>
<id/>
<name/>
<link_to_image/>
<quote/>
</author>
</authors>
Разбираем данные из 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Создаем SimpleAdapter для списка авторов:
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>
public class AuthorSimpleAdapter extends SimpleAdapter {И осталось только назначить AuthorSimpleAdapter списку авторов:
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);
}
}
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.
Загрузить сборник цитат и афоризмов - бесплатно и без рекламы - можно здесь - Говорун - цитаты и афоризмы.
Буду признателен за звездочки и комментарии)
Комментарии
Отправить комментарий