0

我从 XML 文件中获取数据,如下所示:-

   <posts>
          <page id="1">
                      <title>
                            <![CDATA[ Tile no. 1 ]]>
                      </title>

                      <smallimage>
                                 http://www.xyz.com/right.jpg
                      </smallimage>
          </page>

          <page id="2">
                      <title>
                            <![CDATA[ Tile no. 2 ]]>
                      </title>
          </page>

          <page id="3">
                      <title>
                            <![CDATA[ Tile no. 3 ]]>
                      </title>

                      <smallimage>
                                 http://www.xyz.com/left.jpg
                      </smallimage>
          </page>
  </posts>

这是我的 XML 示例,我在其中获取元素,并且在单个 url 中获取 10 个页面,其中存在 10 个,但没有预设 10 个。它可能是 3 或 6 或 1。

在我的代码中,我使用 SAX 解析器来解析这个 XML 文件,我正在获取我的数据并能够在列表视图上显示,但我能够用它们显示图像。

为了显示图像,我使用 LazlyList 示例(ImageLoader 类)。

下面是我的代码:-

MainActivity.java

public class MainActivity extends Activity {
    /** Called when the activity is first created. */

    static final String URL = "http://www.xyz.com/api.php?page_id=1";

    ItemList itemList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        XMLParser parser = new XMLParser();
        String XML = parser.getXmlFromUrl(URL);

        System.out.println("This XML is ========>"+XML);

       try
       {
           SAXParserFactory spf = SAXParserFactory.newInstance();
           SAXParser sp = spf.newSAXParser();
           XMLReader xr = sp.getXMLReader();

           /** Create handler to handle XML Tags ( extends DefaultHandler ) */
           MyXMLHandler myXMLHandler = new MyXMLHandler();
           xr.setContentHandler(myXMLHandler);

           ByteArrayInputStream is = new ByteArrayInputStream(XML.getBytes());
           xr.parse(new InputSource(is));
      }
      catch(Exception e)
      {

      }

      itemList = MyXMLHandler.itemList;

      ArrayList<String> listItem= itemList.getTitle();
      ArrayList<String> listManu = itemList.getSmallimages();


      System.out.println("(ListItem)=======>"+listItem);
      System.out.println("(ListManu)=======>"+listManu);

    //  String ar[];
      Object obj[]=listManu.toArray();
      String[] stringArray=Arrays.asList(obj).toArray(new String[obj.length]);
      System.out.println("Array to String"+Arrays.toString(stringArray));
     // ar=(String[]) listManu.toArray();


     ListView lview = (ListView) findViewById(R.id.listview1);
     myAdapter adapter = new myAdapter(this, listItem, stringArray);
     lview.setAdapter(adapter);        

}

我的适配器.java

public class myAdapter extends BaseAdapter 
{
    ArrayList<String> listTitle;
    String [] data;
    ImageLoader imageLoader;


    Activity activity;

    public myAdapter(Activity activity, ArrayList<String> listTitle, String[] d) {
        super();
        this.listTitle = listTitle;
        this.data = d;


        this.activity = activity;
        this.imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return data.length;

    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    private class ViewHolder
    {
        TextView txtViewTitle;
        ImageView image;


    }

    public View getView(int position, View view, ViewGroup parent) {
        // TODO Auto-generated method stub

        ViewHolder title;
        LayoutInflater inflater = activity.getLayoutInflater();

        if(view==null)
        {
            view = inflater.inflate(R.layout.lview_row, null);
            title = new ViewHolder();

            title.txtViewTitle = (TextView) view.findViewById(R.id.txtItem);
            title.image = (ImageView) view.findViewById(R.id.list_image);

            view.setTag(title);
        }
        else
        {
            title = (ViewHolder) view.getTag();
        }

        title.txtViewTitle.setText(listTitle.get(position));


        imageLoader.DisplayImage(data[position], title.image);

        return view;
    }
}

\

当我使用 return data.length 时,我得到的只是图像和平铺。的图像存在,因为 String [] 只存储图像而不是空格......

public int getCount() {
            return data.length;

但是当我将 data.length 更改为 listTitle.size()

public int getCount() {
            return listTitle.size();

获取空指针异常我正在使用 listTilte.size() 因为它给出了完整的列表......

任何人请建议我如何解决这个问题并在列表视图中获取图像和完整的标题数据以及图像存在的地方只有我会得到带有标题的图像,否则只有标题显示在列表视图中......

先谢谢了。

4

2 回答 2

0

如果不查看您的 MyXMLHandler 的源代码,就不容易为您提供帮助。使用解析 XML 是一件非常痛苦的事情,您正在获取的数据,您是否还控制生成数据的服务器?如果是这样,我强烈建议您改为通过 JSON 发送...

JSON 是一种以类似 javascript 的语法编写对象的方式,易于机器解析,您的列表可能如下所示:

{"posts:":
  [ 
    {"pageId": 1, "title":"sometitle", "smallImage":"someimage.png"},
    {"pageId": 2, "title":"sometitle", "smallImage":"someimage.png"},
    {..... etc }
  ]
}

要在 PHP 中创建它,您所要做的就是:

class PostsList {
  var $posts = array();
}

class Post {
 var $pageId;
 var $title;
 var $smallImage;
 function Post($pageId, $title, $smallImage) {
  $this->pageId = $pageId; $this->title = $title; $this->smallImage = $smallImage;
 }
}
$posts = new PostsList();
$posts->posts[] = new Post(1, "some title", "image.png");
$posts->posts[] = new Post(2, "some other title", "image2.png");

echo json_encode($posts);

现在在java中你制作相同的对象:即

class PostsList { 
  public ArrayList<Post> posts; 
}
class Post { 
  public int pageId; 
  public String title; 
  public String smallImage;
}

然后你得到 GSON(它在 android 中工作),然后你做:

Gson gson = new GsonBuilder().create();
String jsonData = getDataFromServer();
PostsList gotFromServer = gson.fromJson(jsonData, PostsList.class);

瞧!您已经将所有帖子都解析为 java 对象,您甚至可以将 PostsList 对象制作为适配器以与列表一起使用...

在我更加熟悉 JSON 之后,我已经停止使用 XML 进行 RPC,JSON 数据使用起来非常容易,以后添加或删除字段也很容易......

于 2012-04-23T09:00:16.943 回答
0

如果在使用时出现 nullpointerexception,listTitle.size();则 listTitle 未初始化。

您的代码示例不包含 listTitle 的代码,但在 getter 中除外。

于 2012-04-23T08:44:12.133 回答