2016-09-11 2 views
1

У меня настроить ListView с BaseAdapter и до сих пор его работы хорошо с setOnItemClickListener. Но это жесткое кодирование.Android конвертировать JsonArray в массив в Listview с BaseAdapter

enter image description here

Main2Activity.java

String sku[]={"1","2","3","4"}; 
String name[]={"Bad Food","Very Bad Food","Extremly Bad Food","Super Bad Food"}; 
String price[]={"99","999","9999","99999"}; 
String quantity[]={"123","456","789","101112"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(new my_adapter(Main2Activity.this,sku,name,price,quantity)); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Toast.makeText(Main2Activity.this, "Sku->"+sku[i] 
        +" Name->"+name[i] 
        +" Price->"+price[i] 
        +" Quantity->"+quantity[i] 
        ,Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

my_adapter.java

public class my_adapter extends BaseAdapter { 

Context ctx; 
LayoutInflater inflater=null; 

String sku[]; 
String name[]; 
String price[]; 
String quantity[]; 

public my_adapter(Context ctx, String sku[], String name[], String price[],String quantity[]){ 
    this.ctx=ctx; 
    this.sku=sku; 
    this.name=name; 
    this.price=price; 
    this.quantity=quantity; 
} 

@Override 
public int getCount() { 
    return sku.length; 
} 

@Override 
public Object getItem(int i) { 
    return null; 
} 

@Override 
public long getItemId(int i) { 
    return i; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View row=view; 

    if(row==null){ 
     inflater=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row=inflater.inflate(R.layout.rows,null); 
    } 

    TextView product_sku=(TextView)row.findViewById(R.id.sku); 
    TextView product_name=(TextView)row.findViewById(R.id.name); 
    TextView product_price=(TextView)row.findViewById(R.id.price); 
    TextView product_quantity=(TextView)row.findViewById(R.id.quantity); 

    product_sku.setText(sku[i]); 
    product_name.setText(name[i]); 
    product_price.setText(price[i]); 
    product_quantity.setText(quantity[i]); 

    return row; 
} 
} 

Далее, мне нужно сделать что-то подобное, которое должно преобразовать JsonArray в массив и затем используйте его в setOnItemClickLis Tener. Это означает, что мне нужно хранить все данные из json в 4 массивах, а затем использовать любой из элементов позже, когда они нажимают на элемент. Так же, как мой пример жесткого кодирования.

Я видел некоторые примеры с HashMap, а также некоторые JsonArray для кодирования шаблонов массивов, но не уверен, как их объединить с моим ListView и baseAdapter.

Получение данных JSON

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

    @Override 
    public void onResponse(JSONObject response) { 
     // working with HashMap or Arraylist????? 
    } 
}, new Response.ErrorListener() { 

    @Override 
    public void onErrorResponse(VolleyError error) { 
     // TODO Auto-generated method stub 
    } 
}); 
RequestQueue requestQueue = Volley.newRequestQueue(this); 
requestQueue.add(jsObjRequest); 

локальный/web_service/ohno.php

{ 
"482":["1","Chicken Rice","1","1"], //Unique ID, sku,name,price,quantity 
"483":["1","French Fries","1","1"], 
"484":["1","apple","1","1"], 
"492":["1","western+italian","1","1"], 
"493":["1","no_cat","1","1"] 
} 

Формат что у меня есть установка в Listview точно так же, как приведенный выше формат JSON (4 столбцы), кроме формата Json, имеет дополнительный элемент, который является уникальным идентификатором продукта.

+0

так что непонятно в API 'org.json.JSONObject'? – pskink

+0

@pskink http://stackoverflow.com/questions/39425837/android-data-display-in-wrong-format-from-jsonobject-to-listview/39425991?noredirect=1#comment66176097_39425991 ysd Я задал несколько связанных вопросов (простой адаптер) НО, что это в основном строки. Но мой пример выше - Array, любой пример, который работает что-то подобное? – gosulove

+1

ОК, так что непонятно в API 'org.json.JSONArray'? – pskink

ответ

1

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

public class Item { 
    private int id; 
    private String sku; 
    private String name; 
    private String price; 
    private String quantity; 
} 

После получения JSON разобрать его и создать список предметов что-то вроде

public void parseJson(String data) { 
    ArrayList<Item> items = new ArrayList<Item>(); 

    //Parsing logic goes here 
} 

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

Надеюсь, это поможет вам.

+0

звучит нормально, пытаясь сейчас. Просто чтобы подтвердить, что открытый класс Item находится в my_adapter.java и public void parseJson (данные String) в Main2Activity.java? – gosulove

+0

Это до вас, как вы его проектируете. Элемент может быть совершенно самостоятельным классом. Вы также можете посмотреть JSON-маршаллинг с помощью JacksonJson или GSON. Я думаю, вы используете Volley для создания Http-звонков, и есть способ использовать JacksonJson с Volley. –

1

попробовать этот

public void getJson() { 
    AsyncHttpClient client = new AsyncHttpClient(); 
    client.get(localhost/web_service/ohno.php, new JsonHttpResponseHandler() { 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
      super.onSuccess(statusCode, headers, response); 
      ArrayList<String> listData = new ArrayList<>(); 
      JSONArray jsonArray482=response.optJSONArray("482"); 
      if (jsonArray482 != null) { 
       for (int i=0;i<jsonArray482.length();i++){ 
        try { 
         listData.add(jsonArray482.get(i).toString()); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 

    }); 
} 
Смежные вопросы