2017-03-08 53 views
1

這是我MainActivity.java:無法在Android的顯示列表視圖在獲取JSON數據

package example.com.getdata; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 
import org.json.JSONObject; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 
public static final String JSON_URL = "http://172.31.131.52:8081/application/status"; 
private Button buttonGet; 
private ListView listView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    buttonGet = (Button) findViewById(R.id.button2); 

} 
private void sendRequest(){ 
    StringRequest stringRequest = new StringRequest(JSON_URL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        showJSON(response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(MainActivity.this,error.getMessage(),Toast.LENGTH_LONG).show(); 
       } 
      }); 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(stringRequest); 
} 
private void showJSON(String json) { 
    Product product = new Product(json); 
    ArrayList<JSONObject> listItems= product.parseJSON(); 
    listView = (ListView) findViewById(R.id.list_view); 
    CustomList customerList = new CustomList(this,R.layout.list_view_layout,R.id.textViewName, listItems); 
    //customerList.notifyDataSetChanged(); 
    listView.setAdapter(customerList); 
} 
public void clickHere(View v) { 
    sendRequest(); 
} 
} 

Product.java

package example.com.getdata; 

import android.util.Log; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 

import static com.android.volley.VolleyLog.TAG; 


public class Product { 

public String productName; 
public String description; 
public int priceInDollars; 
//public int productID; 

public static final String KEY_Name = "productName"; 
public static final String KEY_Desc = "description"; 
//public static final String KEY_ID= "ProductID"; 
public static final String KEY_Price ="priceInDollars" ; 

private JSONArray users = null; 

private String json; 

public Product(String json){ 
    this.json =json; 
} 

protected ArrayList<JSONObject> parseJSON(){ 
    JSONArray jsonArray=null; 
    ArrayList<JSONObject> aList=new ArrayList<JSONObject>(); 
    try { 
     jsonArray = new JSONArray(json); 
     Log.d("Debugging...", jsonArray.toString()); 
     if(jsonArray != null) { 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jo = jsonArray.getJSONObject(i); 
       productName = jo.getString(KEY_Name); 
       description = jo.getString(KEY_Desc); 
       priceInDollars = jo.getInt(KEY_Price); 
       aList.add(jsonArray.getJSONObject(i)); 
       // productID = jo.getInt(KEY_ID); 
       } 
      return aList; 
     } 
     else { 
       Log.d(TAG, "parseJSON: Null condition"); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
} 

CustomList.java

package example.com.getdata; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 

public class CustomList extends ArrayAdapter<String> { 

private ArrayList<JSONObject> list; 

private int vg; 
private Activity context; 

public CustomList(Activity context,int vg, int id, ArrayList<JSONObject> list) { 
    super(context,R.layout.list_view_layout, id); 
    this.vg = vg; 
    this.context = context; 
    this.list=list; 
    // this.productID=productID; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View listViewItem = inflater.inflate(vg, parent, false); 
    TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName); 
    TextView textViewDescription = (TextView) listViewItem.findViewById(R.id.textViewDescription); 
    TextView textViewPrice = (TextView) listViewItem.findViewById(R.id.textViewPrice); 
    // TextView textViewID = (TextView) listViewItem.findViewById(R.id.textViewID); 
    try { 
     textViewName.setText(list.get(position).getString("productName")); 
     textViewDescription.setText(list.get(position).getString("description")); 
     textViewPrice.setText(list.get(position).getString("priceInDollars")); 
    } 
    catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    // textViewID.setText(productID); 
    return listViewItem; 
} 
} 

我嘗試過並在網上搜索答案,但我仍然無法找出問題所在。我無法看到對象列表。通過調試,我確信這些對象被讀入到json對象中,但我仍然無法在listView中顯示這些對象。

任何幫助表示讚賞。

+0

後樣品JSON – avinash

+0

看到我的答案在下面,它可能會幫助你。 –

+0

你有答案嗎? –

回答

0

擴展CustomList類爲: 類型的JSONObject 而不是 String類型

1

您需要將與Product類的所有變量進行比較,並將所有值放入Product類對象中,並將其添加到ArrayList中。

見產品類別:

public class Product { 

    public String productName; 
    public String description; 
    public int priceInDollars; 
//public int productID; 

    public static final String KEY_Name = "productName"; 
    public static final String KEY_Desc = "description"; 
    //public static final String KEY_ID= "ProductID"; 
    public static final String KEY_Price ="priceInDollars" ; 

    private JSONArray users = null; 

    private String json; 

    public Product(String productName, String json, JSONArray users, int priceInDollars, String description) { 
     this.productName = productName; 
     this.json = json; 
     this.users = users; 
     this.priceInDollars = priceInDollars; 
     this.description = description; 
    } 

    public String getProductName() { 
     return productName; 
    } 

    public void setProductName(String productName) { 
     this.productName = productName; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public static String getKEY_Name() { 
     return KEY_Name; 
    } 

    public static String getKEY_Price() { 
     return KEY_Price; 
    } 

    public String getJson() { 
     return json; 
    } 

    public void setJson(String json) { 
     this.json = json; 
    } 

    public JSONArray getUsers() { 
     return users; 
    } 

    public void setUsers(JSONArray users) { 
     this.users = users; 
    } 

    public static String getKEY_Desc() { 
     return KEY_Desc; 
    } 

    public int getPriceInDollars() { 
     return priceInDollars; 
    } 

    public void setPriceInDollars(int priceInDollars) { 
     this.priceInDollars = priceInDollars; 
    } 
} 

,當你正在分析你的數據,你需要更改類似下面的代碼:

protected ArrayList<Product> parseJSON(){ 
     JSONArray jsonArray=null; 
     ArrayList<Product> aList=new ArrayList<Product>(); 
     try { 
      jsonArray = new JSONArray(json); 
      Log.d("Debugging...", jsonArray.toString()); 
      if(jsonArray != null) { 
       for (int i = 0; i < jsonArray.length(); i++) { 
        JSONObject jo = jsonArray.getJSONObject(i); 
        String productName = jo.optString(KEY_Name); 
        String description = jo.optString(KEY_Desc); 
        String priceInDollars = jo.optInt(KEY_Price); 
        Product product = new Product(productName,json, 
          jsonArray.getJSONObject(i),priceInDollars,description); 
        aList.add(product); 
        // productID = jo.getInt(KEY_ID); 
       } 
       return aList; 
      } 
      else { 
       Log.d(TAG, "parseJSON: Null condition"); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

而且你需要,你必須在適配器類變化通過ArrayList<JsonArray>在這種情況下,您必須通過ArrayList<Product>

0

確保getCount()在Adapterclass正確實施:

@Override 
public int getCount(){ 
     return list.size(); 
} 
0

使用

super(context,R.layout.list_view_layout, list); 

,而不是

super(context,R.layout.list_view_layout, id); 
0

你錯過了

@override 
public int getCount() 
{ 
    return list.size(); 
} 

,並讓您的ListView確保您無論是「setAdapter」得到JSON之後,或者叫「notifydatasetchanged」方法