我从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文件我正在获取我的数据并能够在列表中显示View但我能够用它们显示图像。
为了显示我正在使用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然后我得到图像和瓷砖只有没有。因为String []只存储图像而不是空格......
public int getCount() {
return data.length;
但是当我将data.length更改为listTitle.size()
时public int getCount() {
return listTitle.size();
获取空指针异常我正在使用listTilte.size(),因为它给出了完整的列表...
任何一个PLZ建议我如何能够解决这个问题并在列表视图中获取图像和完整标题数据以及图像存在的位置,只有我将获得带有标题的图像,否则只有标题显示在列表视图中。 ..
感谢高级。
答案 0 :(得分:0)
如果在使用listTitle.size();
时遇到nullpointerexception,则listTitle未初始化。
除了getter之外,你的codesample不包含listTitle的代码。
答案 1 :(得分: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中你可以创建相同的对象:ie
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 for RPC,JSON数据只是太容易使用了,以后很容易添加或删除字段......