2012-04-23 122 views
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的例子,其中我越来越元素,我得到第10页其中存在10个而不是10个的单个url被预设。它可能是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);   

} 

myAdapter.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; 
    } 
} 

\

当我使用回报data.length然后我得到的图像和瓷砖没有。图像的存在,因为字符串[]是存储图像仅不是空格...

public int getCount() { 
      return data.length; 

但是当我改变data.length到listTitle.size()

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

得到空指针异常我使用listTilte.size(),因为它给出了全部列表...

任何一个PLZ建议我怎么能我能解决在列表视图这个问题,并获取图像和完整的标题数据和图像的地方是目前只有我才会得到带有标题的图像,否则只有标题显示y在列表视图中...

Thanks in Advanced。

+2

“获取空指针异常错误”在哪里? – zapl 2012-04-23 08:19:34

+0

hi zapl ...我更新我的问题PLZ看看谢谢... – user755278 2012-04-23 08:32:54

+0

2评论。首先,不要在没有线程的情况下使用httpconnection,而在OnCreate方法中使用最差的<----非常非常糟糕。其次,使用Log.d(“TAG”,文本)而不是系统println – Aracem 2012-04-23 08:37:34

回答

0

如果在使用listTitle.size();时得到nullpointerexception,那么listTitle未初始化。

您的codesample不包含listTitle的代码,除了在getter中。

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数据只是soooooo更容易处理,也很容易后来添加或删除字段...