Комбинация JSONArray и BaseAdapter

#java #android #json #spinner #baseadapter

#java #Android #json #счетчик #baseadapter

Вопрос:

В настоящее время я могу заполнить свой счетчик двумя способами, один из способов дает мне результаты из базы данных, которые мне нужны, но текст в счетчике находится в формате 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) {
        }
    }
);
  

С помощью этого базового адаптера:

 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 / строка выглядит следующим образом,

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

Любая помощь была бы высоко оценена.

Приветствия,

Майк.

Ответ №1:

Вы очень близки к этому, вместо 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. Наконец, вы создаете адаптер с элементами точно так же, как вы делали в первом примере. В этом примере я предполагаю, что мои пользователи находятся в JSONArray.

Комментарии:

1. Забавно, я только что разобрался с этим и вернулся, чтобы сказать «остановить печать». Мой код выглядит точно так же, как ваш! Также спасибо за описание; требуется немного времени, чтобы разобраться во всем этом, и спасибо за твой ответ, приветствия, Майк.