Загрузка проанализированных XML-данных в simpleListAdapter? - PullRequest
0 голосов
/ 28 февраля 2012

Я пишу 3 класса / действия, которые, я надеюсь, (в конце концов) смогут загрузить проанализированные данные XML в simpleListAdapter, используя стандартные макеты Android.

Моя стратегия заключается в том, что задание A: запускает анализатор SAX, загружает обработчик, извлекает ArrayList> из задания C и загружает ArrayList в simpleListAdapter.

Действие B - это обработчик (который, я знаю, работает, потому что я использовал его раньше, никаких проблем там нет).

Наконец, действие C содержит методы, которые возвращают строки, которым задаются значения обработчиком, а затем загружают эти строки в ArrayList>, который отправляется в действие A через намерение.

Но все этопоявляется черный экран.

Я использую тестовый XML-сайт: http://www.google.com/ig/api?weather=Boston+Massachusetts"

Вот код для Деятельности A + C (я знаю, что обработчик работает).

Активность (A):

public class xmlparser extends ListActivity implements OnClickListener {

static final String XMLsite = "http://www.google.com/ig/api weather=Boston+Massachusetts";


public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  





@SuppressWarnings("unchecked")
@Override
    try{
        URL website = new URL(XMLsite);
        //getting xmlreader to parse data
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        HandlingXMLStuff doingWork = new HandlingXMLStuff();
        xr.setContentHandler(doingWork);
        xr.parse(new InputSource(website.openStream()));

        ArrayList<HashMap<String, String>> list =(ArrayList<HashMap<String, String>>) getIntent().getSerializableExtra("arraylist");

        String[] from = { "name", "purpose" };
        int[] to = { android.R.id.text1, android.R.id.text2 };

        SimpleAdapter adapter = new SimpleAdapter(this, list,
                android.R.layout.simple_list_item_2, from, to);
        setListAdapter(adapter);


        }catch(Exception e){

    }
}

Упражнение (C):

package com.school;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class XMLDataCollected extends Activity{
 /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, xmlparser.class);
    ArrayList<HashMap<String, String>> list = buildData();
    intent.putExtra("arraylist", list);
    startActivity(intent);
}

int temp = 0;
String city = null;

public void setCity(String c){
    city = c;

}
public void setTemp(int t){
    temp = t;
}


private ArrayList<HashMap<String, String>> buildData() {
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    list.add(putData(city, "temp"));
    list.add(putData("city", "temp"));
    list.add(putData("city", "temp"));
    return list;
}

private HashMap<String, String> putData(String name, String purpose) {
    HashMap<String, String> item = new HashMap<String, String>();
    item.put("name", name);
    item.put("purpose", purpose);
    return item;
}
}

Любой совет поможет.

PS Я использовал эту процедуру XML, прежде чем загружать данные вtextview, так что я знаю, что он способен, по крайней мере, анализировать теги XML и устанавливать их в методах в Деятельности C, а затем извлекать и устанавливать строки в текстовом представлении, но моя конечная цель - иметь возможность загружать информацию в simpleListAdapter.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 марта 2015

Вот пример примера перечисления названий стран и кода страны из java local в listview с использованием simpleAdapter SimpleAdapter Детальное понимание @ http://www.tutorialsbuzz.com/2014/06/simpleadaper-bind-hashmap-listview.html

Другой пример синтаксического анализа XML и отображения в ListView с использованием SimpleAdapter @ http://www.tutorialsbuzz.com/2015/03/android-sax-xml-parser-http.html

XML-макет для элементов списка

file: list_items.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"
   android:padding="10dp" >

<TextView
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:padding="5dp"
    android:textSize="18dp" />

<TextView
    android:id="@+id/code"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp" />

</LinearLayout> 

file: MainActivity.java

 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Locale;
 import android.app.ListActivity;
 import android.os.Bundle;
 import android.widget.ListAdapter;
 import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity {

ArrayList<HashMap<String, String>> countries;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String[] locales = Locale.getISOCountries();

    countries = new ArrayList<HashMap<String, String>>();

    for (String countryCode : locales) {
        Locale obj = new Locale("", countryCode);

        HashMap<String, String> country = new HashMap<String, String>();

        String country_name = obj.getDisplayCountry();
        String country_code = obj.getCountry();

        country.put("name", country_name);
        country.put("code", country_code);

        countries.add(country);

    }
    //  keys of hashmap
    String[] from = { "name", "code" };

    // view id's to which data to be binded
    int[] to = { R.id.name_id, R.id.code_id };

    //Creating Adapter
    ListAdapter adapter = new SimpleAdapter(MainActivity.this, countries,
            R.layout.list_items, from, to);

    //Setting Adapter to ListView
    setListAdapter(adapter);

}

}

1 голос
/ 28 февраля 2012

Как уже говорили другие, ваш код трагичен.Вам не нужно два действия для этой опции.Вместо этого рассмотрите AsyncTask или Сервис с XMLParser, остающимся в Деятельности один.То, за что затем ответственен каждый, это запуск AsyncTask или Сервиса и извлечение (анализ) его данных по мере их доступности.

public class ActivityOne extends Activity {
    private static final String ADDRESS = "...";
    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        new FetchDataTask(ADDRESS).execute();
    }


    private class FetchDataTask extends AsyncTask<Void, Void, Void> {
        private URL mWebsite;
        private ArrayList<???> mListActivityContent;

        public FetchDataTask(String address) {
            mWebsite = new URL(address);
        }

        @Override public void doInBackground(Void... voids) {
            //getting xmlreader to parse data
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            HandlingXMLStuff doingWork = new HandlingXMLStuff();
            xr.setContentHandler(doingWork);
            xr.parse(new InputSource(mWebsite.openStream()));
            /*
             * Now, you are going to want other parsing and
             * array building stuff here. Looking at your code,
             * I can't figure out how the XMLDataCollected
             * Activity is used, sorry, so you will have to tweak
             * this to accomodate it.
             */
        }

        @Override public void onPostExecute(Void voids) {
            SimpleAdapter adapter = new SimpleAdapter(ActivityOne.this,
            list, android.R.layout.simple_list_item_2, from, to);

            ActivityOne.this.setListAdatper(adapter);
        }
    }
}
...