Разбор XML и отображение его в AlertDialog в Android - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть этот XML-файл со странами и их кодами стран.Вот как это выглядит:

<?xml version="1.0" encoding="UTF-8"?>
<landen>
<land>
   <naam>Afghanistan</naam>
   <code>AF</code>
</land>
<land>
   <naam>Albani�</naam>
   <code>AL</code>
</land>
<land>
   <naam>Algerije</naam>
   <code>DZ</code>
</land>
<land>
</landen>

Теперь я хочу, чтобы люди выбирали одну страну из списка.Я думаю, что AlertDialog было бы неплохо отобразить все.

То, как я получаю значения из моего xml-файла, выглядит следующим образом:

protected ArrayList<Land> getLanden() {
    ArrayList<Land> lijst = new ArrayList<Land>();
    try {
        DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(getAssets().open("landenlijst.xml"));
        NodeList nl = doc.getElementsByTagName("land");
        for (int i=0;i<nl.getLength();i++) {
            Node node = nl.item(i);

            Land land = new Land();

            land.land = Xml.innerHtml(Xml.getChildByTagName(node, "naam"));
            land.landcode = Xml.innerHtml(Xml.getChildByTagName(node, "code"));
            lijst.add(land);
        }
        Log.d("Gabug","Klaar met parsen");
        Log.d("Gabug","Landen: " + lijst);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return lijst;
}

И я использую это, чтобы сделать мой AlertDialog:

public void KiesLandMenu(){
        ArrayList<Land> alleLanden = getLanden();
        final CharSequence[] items = alleLanden.toArray(new CharSequence[alleLanden.size()]);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Kies land");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                switch (item){
                    case 0:
                        break;
                    case 1:
                        break;
                    case 2:
                        break;
                }
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

Я не знаю, работает ли это, поскольку DDMS возвращает какой-то байт-код или что-то еще, когда я его регистрирую.И после этого он принудительно закрывается из-за ArrayStoreException ..

Теперь мой вопрос;это лучший способ сделать это?если да, как я могу исправить ArrayStoreException?Если нет, как лучше разрешить моему пользователю выбрать страну (возможно, совершенно новый взгляд)?Кроме того, как я могу зарегистрировать, в какую страну кто-то нажал?

РЕДАКТИРОВАТЬ:

Я немного изменил приведенный ниже пример кода, и теперь я получаю исключение NullPointerException ..

public void KiesLandMenu(){
    ArrayAdapter<Land> arrAdapter;
    ArrayList<Land> alleLanden = getLanden();
    arrAdapter = new ArrayAdapter<Land>(this, android.R.layout.simple_list_item_single_choice, alleLanden);

    ListView list = (ListView)findViewById(R.layout.lijstview);
    list.setAdapter(arrAdapter);
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

    list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> list, View view, int position,
                long id) {
            Log.e("item clicked", String.valueOf(position));
        }
    });
}

Исключение NullPointerException составляет list.setAdapter(arrAdapter);

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

Сделайте макет с помощью ListView, затем установите этот макет в вашем onCreate. Чтобы составить список, вы можете сделать что-то вроде:

public class RunTestProject extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);  //whatever you want your layout to be
}

// getLanden() implementation goes here


public void KiesLandMenu(){
    ArrayList<Land> alleLanden = getLanden();
    arrAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, alleLanden);

    Dialog dialog = new Dialog(this);
    dialog.setTitle("Kies land");
    dialog.setContentView(R.layout.withList); // The dialog layout
    ListView list = (ListView) dialog.findViewById(android.R.id.list); //note that it's not simply findViewById
    list.setAdapter(arrAdapter);
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

    list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> list, View view, int position,
                long id) {
            Log.e("item clicked", String.valueOf(position));
        }
    });

    dialog.show();      
}

}

Когда пользователь выбирает элемент, в журнале вы видите, что позиция элемента в массиве показана.

Ваш файл макета может выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
         /> 
</LinearLayout>
0 голосов
/ 24 ноября 2010
new AlertDialog.Builder(this)
            .setIcon(R.drawable.alert_dialog_icon)
            .setTitle(R.string.alert_dialog_single_choice)
            .setSingleChoiceItems(<ListAdapter> or CharaSequnce[] , 0, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    /* User clicked on a radio button do some stuff */
                }
            })
            .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    /* User clicked Yes so do some stuff */
                }
            })
            .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    /* User clicked No so do some stuff */
                }
            })
           .create();

Примечание: Пожалуйста, смотрите Эта ссылка на Api для жирного текста, упомянутого ниже

.setSingleChoiceItems ( CharacterSequnce [] , 0, новый DialogInterface.OnClickListener () ....

Надеюсь, это поможет. Спасибо:)

0 голосов
/ 24 ноября 2010

Вы могли бы, вероятно, расширить AlertDialog и дать ему ListView в качестве представления.Затем привяжите ListView к ListAdapter, который использует ваш ArrayList.

Редактировать:

ListView lv = new ListView(context);
ArrayAdapter aa = new ListAdapter(context, viewid, lijst);
lv.setAdapter(aa);
AlertDialog ad = new AlertDialog(context);
ad.setView(lv);

Хотя работы немного больше, чем это.Вам нужно указать viewid, то есть View, представляющий каждый элемент в ListView.

Ссылка на SDK очень хорошая, вы знаете.

...