xml フィードからデータを取得し、Android アプリケーションに表示する必要があります。
私のxmlフィードは次のようになります:
<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>
ここでは、カテゴリ名を表示する必要があります。また、所属するカテゴリの記事のタイトルを表示する必要があります。出力を表示したいのは次のとおりです。
Books
Android Java PHP MySql
Names
Dita Frieda Demi Shyamalan Krish
私は以下のコードを使用しています:
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);
}
ここでアプリを実行する必要があるということは、記事のタイトルが表示されることを意味します。しかし、記事のタイトルが正しく表示されません。現在の o/p は次のようになっています。
Books
Krish Krish
Names
Krish Krish
すべてのカテゴリで最新の記事タイトルが表示されます。なぜこのエラーが発生するのですか?助けてください...どうすればこれらのエラーを解決できますか??? アイデアを教えてください???
編集:
以下のようにコードを変更しました。
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を取得していることを意味するアプリを実行する必要があります:
[Books,Names]
[Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish] [Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]
[Books,Names]
[Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish] [Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]
pls は、正しい o/p (必要な設計) を取得するためのアイデアを提供してくれます。
これは私の LazyAdpter ファイルです:
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;
}
これは 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;
}