【问题标题】:problem in forming gridview with images in the web用网络中的图像形成网格视图的问题
【发布时间】:2011-05-18 15:33:21
【问题描述】:

在我的应用程序中,我试图从存储在 web 中的 xml 文件形成网格视图。

以下是我的代码

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

【问题讨论】:

  • 获取图像是什么意思?它哪里出错了?你有例外吗?您可以从 xml 文件中读取所有图像吗?适配器中的所有图像都可用吗?网格视图是否可见,构造正确?您需要更具体地说明什么是错误的、它做了什么、您期望它做什么以及什么是有效的。
  • 我能够读取所有图像的名称。在我的 gridView 中,我只得到 xml 文件中的最后一个图像。我无法查看 xml 文件中的所有图像。
  • 那适配器呢?它包含图像吗?
  • 它只包含一张图片....
  • 你的xml有点乱,你需要从这个xml中输出什么样的图片呢? 还是 ?顺便说一句,使用这样的标签 我的意思是 [\d] 不是一个好习惯...

标签: java android xml gridview iterator


【解决方案1】:

您的代码不完整,因此很难给出明确的答案,但如果imageXMLfn 分配给id = it.next(),则在最后的while 循环中。图像适配器仅使用id,它设置为迭代器中的最后一个值。假设arl 是您的ArrayList&lt;String&gt; 类型类中的一个字段,它可能可以通过以下方式解决:

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 中时,根本不显示任何图像,因为当翻转屏幕时,当前显示会像多媒体幻灯片一样疯狂,您的图像会在其中闪烁,并且可能会错误地更新。然后我发现如果你对gridview变量做一个Fling检测比如:

                    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 将导致刷新新下载的图像。此外,在调用 Lazy 后台加载程序时,在进程启动后,我立即加载占位符位图。我现在只需要找到一种方法来获取一些剩余的占位符图像,这些图像会以某种方式在一些卷轴上找到,以便在图像可用时进行更新。 Lazy Loaders 遍布互联网,并认为它是一种比您上面的代码更好的加载远程图像的方法。这是 Androider 试图完成的最棘手的事情之一。和我遇到的所有其他“陷阱”一样长。希望这可以为您解决问题。编码愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 2021-12-22
      • 1970-01-01
      • 2011-06-11
      • 2013-06-23
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多