Java androidxml解析中的hashmap
我必须从xml提要获取数据并在android应用程序上显示 我的xml提要如下所示:Java androidxml解析中的hashmap,java,android,xml-parsing,iterator,hashmap,Java,Android,Xml Parsing,Iterator,Hashmap,我必须从xml提要获取数据并在android应用程序上显示 我的xml提要如下所示: <root> <Categories> <Category name="Books"> <Articles> <article articleid="4537" title="Android" /> <article articleid="4560" title="Java" /> <article arti
<root>
<Categories>
<Category name="Books">
<Articles>
<article articleid="4537" title="Android" />
<article articleid="4560" title="Java" />
<article articleid="4585" title="PHP" />
<article articleid="4731" title="MySql" />
</Articles>
</Category>
<Category name="Names">
<Articles>
<article articleid="266" title="Dita" />
<article articleid="268" title="Frieda" />
<article articleid="269" title="Demi" />
<article articleid="271" title="Shyamalan" />
<article articleid="269" title="Krish" /></Articles>
</Category>
</Categories></root>
我使用了以下代码:
static final String KEY_TITLE = "Category";
static final String KEY_ARTICLE = "article";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_TITLE);
NodeList nl1 = doc.getElementsByTagName(KEY_ARTICLE);
System.out.println(nl.getLength());
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
System.out.println(nl.getLength());
HashMap<String, String> map = new HashMap<String, String> ();
map.put( KEY_TITLE,((Element)nl.item(i)).getAttribute("name"));
for (int j = 0; j < nl1.getLength(); j++) {
map.put( KEY_ARTICLE,((Element)nl1.item(j)).getAttribute("title"));
}
songsList.add(map);
}
最后一篇文章的标题显示在所有类别上。为什么会发生这些错误???请帮助我…我如何解决这些错误???请给我一些想法
编辑:
我已更改代码,如下所示:
public class MainActivity extends Activity {
static final String URL = "xxx";
static final String KEY_TITLE = "Category";
static final String KEY_ARTICLE = "article";
static final String KEY_IMAGE = "image";
LazyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ArrayList<HashMap<String, List<String>>> songsList = new ArrayList<HashMap<String, List<String>>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_TITLE);
NodeList nl1 = doc.getElementsByTagName(KEY_ARTICLE);
NodeList nl2 = doc.getElementsByTagName(KEY_IMAGE);
System.out.println(nl.getLength());
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
for(int i = 0; i < nl.getLength(); i++) {
String name = ((Element) nl.item(i)).getAttribute("name");
populateMap(map, name, KEY_TITLE);
for(int j = 0; j < nl1.getLength(); j++) {
String title=((Element) nl1.item(j)).getAttribute("title");
populateMap(map, title, KEY_ARTICLE);
String url=((Element) nl2.item(j)).getAttribute("url");
populateMap(map, url, KEY_IMAGE);
}
songsList.add(map);
}
GridView list = (GridView) findViewById(R.id.listView1);
adapter = new LazyAdapter(this, songsList);
list.setAdapter(adapter);
private void populateMap(HashMap<String, List<String>> map, String value,
String key) {
// TODO Auto-generated method stub
List<String> myList;
if(!map.containsKey(key)) {
myList = new ArrayList<String>();
myList.add(value);
map.put(key, myList);
} else {
myList = map.get(key);
myList.add(value);
}
请给我一些想法,以获得正确的o/p(我需要的设计)
这是我的Lazyadter文件:
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, List<String>>> data;
private static LayoutInflater inflater = null;
public ImageLoader imageLoader;
ListAdapter listViewAdapter;
public LazyAdapter(Activity a, ArrayList<HashMap<String, List<String>>> songsList) {
activity = a;
data = songsList;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
vi = inflater.inflate(R.layout.list_row,parent, false);
TextView title = (TextView) vi.findViewById(R.id.title);
Gallery listview = (Gallery) vi .findViewById(R.id.model);
HashMap<String, List<String>> item = new HashMap<String, List<String>>();
item = data.get(position);
title.setText(item.get(MainActivity.KEY_TITLE).toString());
listViewAdapter = new ListAdapter(activity, data);
listview.setAdapter(listViewAdapter);
return vi;
}
公共类LazyAdapter扩展了BaseAdapter{
私人活动;
私有数组列表数据;
专用静态充气机=空;
公共图像加载器;
ListAdapter listViewAdapter;
公共LazyAdapter(活动a,ArrayList歌曲列表){
活动=a;
数据=歌曲列表;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
imageLoader=新的imageLoader(activity.getApplicationContext());
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
vi=充气机。充气(右布局。列表行,父,假);
TextView title=(TextView)vi.findViewById(R.id.title);
Gallery listview=(Gallery)vi.findViewById(R.id.model);
HashMap项=新建HashMap();
item=data.get(位置);
title.setText(item.get(MainActivity.KEY_title.toString());
listViewAdapter=新的ListAdapter(活动、数据);
setAdapter(listViewAdapter);
返回vi;
}
这是ListAdapter类:
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
vi = inflater.inflate(R.layout.listrow,parent, false);
TextView title = (TextView) vi.findViewById(R.id.textView1);
HashMap<String, List<String>> item = new HashMap<String, List<String>>();
item = data.get(position);
title.setText(item.get(MainActivity.KEY_ARTICLE).toString());
return vi;
}
public View getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
vi=充气机充气(R.layout.listrow,父项,false);
TextView title=(TextView)vi.findViewById(R.id.textView1);
HashMap项=新建HashMap();
item=data.get(位置);
title.setText(item.get(MainActivity.KEY_ARTICLE.toString());
返回vi;
}
在这一行map.put(KEY_ARTICLE,((Element)nl1.item(j)).getAttribute(“title”);
您过度写入了地图中以前的值。将ArrayList songsList
更改为ArrayList songsList
,并将每个值添加到列表中并将其放入地图。即使这样做,也会得到如下输出:
Books
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish
Names
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish
为了获得所需的输出,在每个代码< >类别>代码下,应考虑<代码> >文章>代码>的NODLIST,而不是在文档中获得所有的<>代码>文章< /代码>标签。
Map<String,List<String>> categoryToArticlesMap = new HashMap<String,List<String>>();
NodeList categoryNd = doc.getElementsByTagName("Category");
for (int i = 0; i < categoryNd.getLength(); i++)
{
Element e = (Element) categoryNd.item(i);
String categoryName = e.getAttribute("name");
NodeList articlesNd = e.getElementsByTagName("Articles");
Element e1 = (Element) articlesNd.item(0);
NodeList articleNd = e1.getElementsByTagName("article");
List<String> articles = new ArrayList<String>();
for (int j = 0; j < articleNd.getLength(); j++) {
Element articleNode = (Element) articleNd.item(j);
String articleName = articleNode.getAttribute("title");
articles.add(articleName);
}
categoryToArticlesMap.put(categoryName, articles);
}
nodelistcategorynd=doc.getElementsByTagName(“类别”);
对于(int i=0;i这将为您提供所需的输出。我的回答有助于您解决此问题吗?您是从我发布的代码中获得此输出的吗?@Festus Tamakloe是的,我是从您的回答中获得这些o/p您的项目是开源的吗?您为什么需要
ArrayList Android Java PHP MySQL和名称-->Dita Frieda Demi Shymalan Krish,对吗?是的希望o/p看起来像书-->Android Java PHP MySQL和名称-->Dita Frieda Demi Shyamalan Krish ly…你可能会说像将ArrayList歌曲列表更改为ArrayList歌曲列表..这就是我编写的上述代码
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
vi = inflater.inflate(R.layout.listrow,parent, false);
TextView title = (TextView) vi.findViewById(R.id.textView1);
HashMap<String, List<String>> item = new HashMap<String, List<String>>();
item = data.get(position);
title.setText(item.get(MainActivity.KEY_ARTICLE).toString());
return vi;
}
Books
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish
Names
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish
Map<String,List<String>> categoryToArticlesMap = new HashMap<String,List<String>>();
NodeList categoryNd = doc.getElementsByTagName("Category");
for (int i = 0; i < categoryNd.getLength(); i++)
{
Element e = (Element) categoryNd.item(i);
String categoryName = e.getAttribute("name");
NodeList articlesNd = e.getElementsByTagName("Articles");
Element e1 = (Element) articlesNd.item(0);
NodeList articleNd = e1.getElementsByTagName("article");
List<String> articles = new ArrayList<String>();
for (int j = 0; j < articleNd.getLength(); j++) {
Element articleNode = (Element) articleNd.item(j);
String articleName = articleNode.getAttribute("title");
articles.add(articleName);
}
categoryToArticlesMap.put(categoryName, articles);
}