#java #android #xml #gridview #iterator
#java #Android #xml #gridview #итератор
Вопрос:
в моем приложении я пытаюсь сформировать представление сетки из XML-файла, который был сохранен в Web.
Ниже приведен мой код
grid = (GridView)findViewById(R.id.gridView1);
imageXMLfn();
grid.setAdapter(new ImageAdapter(this));
private void imageXMLfn()
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setCoalescing(true);
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder parser = factory.newDocumentBuilder();
URL url = new URL(UserManual.IMAGE_URL);
Log.e("ViewImage3","" UserManual.IMAGE_URL);
Document document= parser.parse(new InputSource(url.openStream()));
NodeList sections = document.getElementsByTagName("application");
numSections = sections.getLength();
for (int i = 0; i < numSections; i )
{
Element section = (Element) sections.item(i);
if(section.hasChildNodes()==true)
{
NodeList section1=section.getChildNodes();
for(int j=0;j<section1.getLength();j )
{
if(section1.item(j).hasChildNodes()==true)
{
for(int k=0;k<section1.item(j).getChildNodes().getLength();k )
{
xmlvalue=String.valueOf(section1.item(j).getChildNodes().item(k).getNodeValue()).trim();
arl.add(xmlvalue);
}
}
}
}
}
}
catch(Exception e)
{
System.out.println(e);
Log.e("ViewImage Error1",e.getMessage());
}
Iterator<String> itr = arl.listIterator();
int z=0,x=0,increment=0;
while (itr.hasNext())
{
id = itr.next();
img = img id;
z ;
}
}
public class ImageAdapter extends BaseAdapter
{
private Context myContext;
private String[] myRemoteImages = {id};
public ImageAdapter(Context c)
{
this.myContext = c;
}
}
Либо я получаю только первое изображение, сохраненное в этом URL, либо я не получаю никаких других изображений
Ниже приведена ссылка, по которой я пытаюсь получить изображения
http://94.23.207.167/websiteIphone/Admin/XML/Santa.xml
Комментарии:
1. Что вы имеете в виду под получением изображения? Где это происходит неправильно? Вы получаете исключение? Можете ли вы прочитать все изображения из xml-файла? Все ли изображения доступны в адаптере? Виден ли gridview, правильно ли сконструирован? Вам нужно быть более конкретным в отношении того, что не так, что это делает, чего вы ожидаете от этого и что работает.
2. я могу прочитать названия всех изображений. В моем GridView я получаю только последнее изображение в XML-файле. Я не могу просмотреть все изображения в XML-файле.
3. Что тогда насчет адаптера? Содержит ли он изображения?
4. он содержит только одно изображение….
5. Ваш xml немного запутан, какие изображения вам нужно выводить из этого самого xml? <изображение[d]> или <значки>? Кстати, не рекомендуется использовать такие теги <picture[d]> Я имею в виду [d] в нем…
Ответ №1:
Ваш код неполон, поэтому немного сложно дать определенный ответ, но в цикле while в конце, если imageXMLfn
вы назначаете id = it.next()
. Адаптер изображений использует только то, id
для которого установлено последнее значение в итераторе. Предположим, что arl
это поле в вашем классе типа ArrayList<String>
, вероятно, это можно решить с помощью:
public class ImageAdapter extends BaseAdapter
{
private Context myContext;
private String[] myRemoteImages = arl.toArray(new String[arl.size()]);
public ImageAdapter(Context c)
{
this.myContext = c;
}
}
Однако ваш код действительно неполон в этом отношении, поэтому я не уверен, сработает ли это.
Ответ №2:
Что я выяснил в основном из-за этой же проблемы, так это. Ленивая загрузка ваших изображений в фоновом режиме. При использовании onpostexecute вообще не отображайте никаких изображений из-за того, что при перемещении экрана текущее отображение затем сходит с ума, как мультимедийный slideshpw, где ваши изображения мигают и могут неправильно обновляться. Затем я обнаружил, что если вы выполняете обнаружение переключения в переменной gridview, такой как:
mPhotoView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if(scrollState != SCROLL_STATE_IDLE) {
mAdapter.setFlinging(true);
} else {
mAdapter.setFlinging(false);
}
int first = view.getFirstVisiblePosition();
int count = view.getChildCount();
if (scrollState == SCROLL_STATE_IDLE || (first count >
mAdapter.getCount()) ) {
mPhotoView.invalidateViews();
}
}
});
invalidateViews приведет к обновлению вновь загруженных изображений. Кроме того, при вызове отложенного фонового загрузчика, сразу после запуска процесса, я загружаю растровое изображение-заполнитель. Мне только сейчас нужно найти способ получить несколько оставшихся изображений-заполнителей, которые каким-то образом попадают в некоторые свитки для обновления, когда изображения будут доступны. Ленивые загрузчики разбросаны по всему Интернету и считают, что это гораздо лучший способ загрузки удаленных изображений, чем приведенный выше код. Это одна из самых сложных задач, которые пытаются выполнить Android. У меня заняло столько же времени, сколько и все остальные «подводные камни», с которыми я сталкивался. Надеюсь, это прояснит ситуацию для вас. Удачного кодирования.