【问题标题】:Android convert JsonArray to Array in Listview with BaseAdapterAndroid 使用 BaseAdapter 将 JsonArray 转换为 Listview 中的数组
【发布时间】:2016-09-11 06:38:57
【问题描述】:

我已经设置了一个 Listview 与 BaseAdapter,到目前为止它与 setOnItemClickListener 一起工作正常。但这是硬编码。

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 转换为 Array,然后在 setOnItemClickListener 中使用它。 这意味着,我需要将 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);

localhost/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 格式有一个额外的元素是唯一产品 ID。

【问题讨论】:

  • 那么org.json.JSONObject API 中有什么不清楚的地方?
  • @pskink stackoverflow.com/questions/39425837/… ysd 我已经问了一些相关的问题(简单的适配器),但其中一个主要是字符串。但是我上面的例子是 Array,有什么类似的例子吗?
  • 好的,那么org.json.JSONArray API 中有什么不清楚的地方?
  • 你有 SimpleAdapter 的工作解决方案,所以只需在 setOnItemClickListener 方法中使用该适配器
  • 请阅读Adapter API,提示:adapterView.getAdapter().getItem(positionInAdapter)

标签: android listview


【解决方案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();
                    }
                }
            }
        }

    });
}

【讨论】:

    【解决方案2】:

    理想的做法是实际创建一个 Model 类或 POJO 类,其中包含 sku、name、price、quantity、id 等成员变量。代码可能看起来像

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

    在得到 json 后解析它并创建一个类似的 Item 列表

    public void parseJson(String data) {
        ArrayList<Item> items = new ArrayList<Item>();
    
        //Parsing logic goes here
    }
    

    创建完项目列表后,您可以让 ArrayAdapter 或 BaseAdapter 接受它,然后遍历列表并设置适当的值。对我来说,这似乎是正确的方法,而不是创建单独的数组然后将其传递给 BaseAdapter。

    希望对你有所帮助。

    【讨论】:

    • 听起来不错,现在试试。只是为了确认 public 类 Item 在 my_adapter.java 和 public void parseJson(String data) 在 Main2Activity.java?
    • 如何设计取决于您。 Item 可以是一个完全独立的类。您还可以查看 JSON marshalling using JacksonJson 或 GS​​ON。我认为您正在使用 Volley 进行 Http 调用,并且有一种将 JacksonJson 与 Volley 一起使用的方法。
    猜你喜欢
    • 2014-01-30
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多