Сочетание JSONArray и BaseAdapter - PullRequest
0 голосов
/ 10 ноября 2011

В настоящее время я могу заполнить мой счетчик двумя способами, один из способов дает мне результаты из базы данных, которая мне нужна, но текст в счетчике находится в формате JSON, все работает, но выглядит плохо, тогда, если я извлекаюимя из JSON и его использование Я теряю часть значения пары имя-значение.

Мне сообщили, что мне нужно использовать подкласс BaseAdapter, чтобы иметь возможность делать то, что мне нужно.Приведенный ниже код работает так же, как я хотел бы, но данные жестко запрограммированы, что бесполезно.

Я хочу заполнить MyData ниже данными JSON, возвращенными из базы данных.

Этот код:

final MyData items[] = new MyData[4];
items[0] = new MyData( "Ken's Plimbing","125738468");
items[1] = new MyData( "Peninsula Pests","3787906453");
items[2] = new MyData( "Joe's Electrical","129754354");
items[3] = new MyData( "Garderning Supplies","097803452");*/

ArrayAdapter<MyData> adapter = new ArrayAdapter<MyData>(PropertyManagement.this, android.R.layout.simple_spinner_item, items );
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
userSpinner.setAdapter(adapter);

userSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            MyData d = items[position];
            Toast.makeText(PropertyManagement.this, d.getValue(), Toast.LENGTH_SHORT).show();
        }
            public void onNothingSelected(AdapterView<?> parent) {
        }
    }
);

С этим BaseAdapter:

class MyData {
    public MyData( String spinnerText, String value ) {
        this.spinnerText = spinnerText;
        this.value = value;
    }
    public String getSpinnerText() {
        return spinnerText;
    }
    public String getValue() {
        return value;
    }
    public String toString() {
        return spinnerText;
    }
    String spinnerText;
    String value;

Работает!

Но мне нужно заполнить MyData массивом JSON, возвращаемым избаза данных.Я делал это с помощью следующего пункта в этом посте.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(PropertyManagement.this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

final MyData items[] = new MyData[4];
for (int i = 0; i < myUsers.length(); ++i)
{
    adapter.add(myUsers.getJSONObject(i).getString("BusinessName")); 
};
userSpinner.setAdapter(adapter);

JSONArray / string выглядит так:

{"BusinessName":"Petes Plumbing","BusinessPhone":"0434943743"},{"BusinessName":"Joes Electrical","BusinessPhone":"0466367279"}

Любая помощь будет принята с благодарностью.

Ура,

Майк.

1 Ответ

0 голосов
/ 10 ноября 2011

Вы очень близки здесь, вместо файла adapter.add в цикле for вам необходимо добавить его к элементам. Рефакторинг так:

final MyData items[] = new MyData[myUsers.length()];
for (int i = 0; i < MyData.length(); ++i){
  items[i] = new MyData(myUsers.getJSONObject(i).getString("BusinessName"), myUsers.getJSONObject(i).getString("BusinessPhone"));
}
ArrayAdapter<MyData> adapter = new ArrayAdapter<MyData>(PropertyManagement.this, android.R.layout.simple_spinner_item, items );
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
userSpinner.setAdapter(adapter);

Что отличается здесь, так это то, что вы определяете длину вашего JSONArray и создаете новый массив MyItem такого размера. Затем вы инициализируете элементы новыми MyItems на основе значений из вашего JSONArray. Наконец, вы создаете адаптер с элементами, как вы это делали в первом примере. В этом примере я предполагаю, что myUsers в JSONArray.

...