如何解决 Android 列表视图无法正常工作的问题
我正在尝试从网络读取 XML 并将其显示在列表视图中。在 XML 中,我有 3 条记录,而我的列表视图仅显示最后一条记录。如果有人能帮助我找出错误,那就太好了! 我正在使用 SAX 从网络上读取数据。
处理程序:
public class SearchItemHandler extends DefaultHandler{
private boolean in_itemName=false;
private boolean in_itemAddress=false;
private boolean in_itemLatitude=false;
private boolean in_itemLongitude=false;
private boolean in_business=false;
private boolean in_local=false;
private SearchItem sItem=new SearchItem();
public SearchItem getParsedData(){
return this.sItem;
}
public static List<SearchItem> list=new ArrayList<SearchItem>();
@Override
public void startDocument() throws SAXException {
this.sItem = new SearchItem();
}
@Override
public void endDocument() throws SAXException {
// Nothing to do
}
@Override
public void startElement(String namespaceURI,String localname,String qName,Attributes atts)throws SAXException{
if(localname.equalsIgnoreCase("Business")){
this.in_business=true;
}else if(localname.equalsIgnoreCase("local")){
this.in_local=true;
}else if(localname.equalsIgnoreCase("ItemName")){
String itemname=atts.getValue("name");
sItem.setItemName(itemname);
this.in_itemName=true;
}else if(localname.equalsIgnoreCase("ItemAddress")){
String itemaddress=atts.getValue("address");
sItem.setItemAddress(itemaddress);
this.in_itemAddress=true;
}else if(localname.equalsIgnoreCase("Latitude")){
double lat=Double.parseDouble(atts.getValue("lat"));
sItem.setLatitude(lat);
this.in_itemLatitude=true;
}else if(localname.equalsIgnoreCase("Longitude")){
double lon=Double.parseDouble(atts.getValue("lon"));
sItem.setLatitude(lon);
this.in_itemLongitude=true;
}
list.add(sItem);
}
endElement方法:
@Override
public void endElement(String namespaceURI, String localname, String qName)throws SAXException {
if(localname.equalsIgnoreCase("Business")){
this.in_business=false;
}else if(localname.equalsIgnoreCase("local")){
this.in_local=false;
}else if(localname.equalsIgnoreCase("ItemName")){
this.in_itemName=false;
}else if(localname.equalsIgnoreCase("ItemAddress")){
this.in_itemAddress=false;
}else if(localname.equalsIgnoreCase("Latitude")){
this.in_itemLatitude=false;
}else if(localname.equalsIgnoreCase("Longitude")){
this.in_itemLongitude=false;
}
}
@Override
public void characters(char ch[], int start, int length) {
if(this.in_local){
//currentCondition.(new String(ch, start, length));
// sItem.equals(new String(ch,start,length));
}
}
Activity:
public class SearchItemListActivity extends ListActivity{
String param="Bar";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_list);
try {
URL url = new URL("http://www.webitour.dk/service/localbusiness.aspx?cat="+param);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
SearchItemHandler searchHandler=new SearchItemHandler();
xr.setContentHandler(searchHandler);
xr.parse(new InputSource(url.openStream()));
SearchItem sItem=searchHandler.getParsedData();
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
HashMap<String,String> item = new HashMap<String,String>();
item.put("Name",sItem.getItemName());
item.put("Address", sItem.getItemAddress());
list.add(item);
SimpleAdapter adapter = new SimpleAdapter(
this,
list,
R.layout.custom_text_view,
new String[] {"Name","Address"},
new int[] {R.id.text1,R.id.text2}
);
setListAdapter(adapter);
}catch(Exception e){
}
}
}
SearchItem 类:
public class SearchItem {
private String itemName;
private String itemAddress;
public SearchItem(){}
public String getItemName(){
return this.itemName;
}
public void setItemName(String itemName){
this.itemName=itemName;
}
public String getItemAddress(){
return this.itemAddress;
}
public void setItemAddress(String itemAddress){
this.itemAddress=itemAddress;
}
}
I am trying to read an XML from the web and display them in a Listview. In the XML I have 3 records and my Listview only showing the last record. Would be great if anyone can help me identifying the mistakes!!
I am using SAX to read from the web.
Handler:
public class SearchItemHandler extends DefaultHandler{
private boolean in_itemName=false;
private boolean in_itemAddress=false;
private boolean in_itemLatitude=false;
private boolean in_itemLongitude=false;
private boolean in_business=false;
private boolean in_local=false;
private SearchItem sItem=new SearchItem();
public SearchItem getParsedData(){
return this.sItem;
}
public static List<SearchItem> list=new ArrayList<SearchItem>();
@Override
public void startDocument() throws SAXException {
this.sItem = new SearchItem();
}
@Override
public void endDocument() throws SAXException {
// Nothing to do
}
@Override
public void startElement(String namespaceURI,String localname,String qName,Attributes atts)throws SAXException{
if(localname.equalsIgnoreCase("Business")){
this.in_business=true;
}else if(localname.equalsIgnoreCase("local")){
this.in_local=true;
}else if(localname.equalsIgnoreCase("ItemName")){
String itemname=atts.getValue("name");
sItem.setItemName(itemname);
this.in_itemName=true;
}else if(localname.equalsIgnoreCase("ItemAddress")){
String itemaddress=atts.getValue("address");
sItem.setItemAddress(itemaddress);
this.in_itemAddress=true;
}else if(localname.equalsIgnoreCase("Latitude")){
double lat=Double.parseDouble(atts.getValue("lat"));
sItem.setLatitude(lat);
this.in_itemLatitude=true;
}else if(localname.equalsIgnoreCase("Longitude")){
double lon=Double.parseDouble(atts.getValue("lon"));
sItem.setLatitude(lon);
this.in_itemLongitude=true;
}
list.add(sItem);
}
endElement method:
@Override
public void endElement(String namespaceURI, String localname, String qName)throws SAXException {
if(localname.equalsIgnoreCase("Business")){
this.in_business=false;
}else if(localname.equalsIgnoreCase("local")){
this.in_local=false;
}else if(localname.equalsIgnoreCase("ItemName")){
this.in_itemName=false;
}else if(localname.equalsIgnoreCase("ItemAddress")){
this.in_itemAddress=false;
}else if(localname.equalsIgnoreCase("Latitude")){
this.in_itemLatitude=false;
}else if(localname.equalsIgnoreCase("Longitude")){
this.in_itemLongitude=false;
}
}
@Override
public void characters(char ch[], int start, int length) {
if(this.in_local){
//currentCondition.(new String(ch, start, length));
// sItem.equals(new String(ch,start,length));
}
}
The Activity:
public class SearchItemListActivity extends ListActivity{
String param="Bar";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_list);
try {
URL url = new URL("http://www.webitour.dk/service/localbusiness.aspx?cat="+param);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
SearchItemHandler searchHandler=new SearchItemHandler();
xr.setContentHandler(searchHandler);
xr.parse(new InputSource(url.openStream()));
SearchItem sItem=searchHandler.getParsedData();
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
HashMap<String,String> item = new HashMap<String,String>();
item.put("Name",sItem.getItemName());
item.put("Address", sItem.getItemAddress());
list.add(item);
SimpleAdapter adapter = new SimpleAdapter(
this,
list,
R.layout.custom_text_view,
new String[] {"Name","Address"},
new int[] {R.id.text1,R.id.text2}
);
setListAdapter(adapter);
}catch(Exception e){
}
}
}
SearchItem class:
public class SearchItem {
private String itemName;
private String itemAddress;
public SearchItem(){}
public String getItemName(){
return this.itemName;
}
public void setItemName(String itemName){
this.itemName=itemName;
}
public String getItemAddress(){
return this.itemAddress;
}
public void setItemAddress(String itemAddress){
this.itemAddress=itemAddress;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我仔细阅读了您的代码,然后我发现您犯了非常严重的错误。
通过此代码,您只能看到列表中的最后一条记录。
这样做我提到打击。
1-:创建一个带有变量的类
public String Name,Address....
2-:在SearchItemHandler类中创建一个列表。
公共静态列表=新列表();
然后
在解析 xml 时,您应该创建一个 ClassName 的对象(在上面创建)
并通过xml getValue设置类的每个数据成员的值
然后将此对象放入列表中。
解析结束时,您会在 list 中找到三个对象。
3-: 在 SearchItemListActivity 类中访问此列表
并获取每个对象的值并创建一个数组适配器。
4-:将此适配器放入列表中,然后您会在列表中找到三个项目。
希望对您有帮助,如果您发现任何问题请正确评论。
I have read your code carefully then i have found you have done very serious mistake.
By this code you have seen only last record in the list.
Do this this i mention blow.
1-:Create a class with variable
public String Name,Address....
2-:Create a list in SearchItemHandler Class.
public static List=new List();
then
In the parsing of xml Your should create a Object of your ClassName(Create Above)
and set the value of each data member of class by xml getValue
then put this object in list.
at the end of parsing you find three object in list .
3-: Access this list in SearchItemListActivity class
and fatch the value of each object and make a array adapter.
4-:Put this adapter in list then you find three item in list.
I hope this is help if you find any problem please right comment.