Reputation: 99
I want to create listview. I refer from https://demonuts.com/android-listview-using-volley/.
I only get the source code for android but not the php. When I create my own php files, the apps continue display loading and never stop. When I see the log cat, it shows that "type org.json.JSONArray cannot be converted to JSONObject"
Below is the code
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.lv);
retrieveJSON();
}
private void retrieveJSON() {
showSimpleProgressDialog(this, "Loading...","Fetching Json",false);
StringRequest stringRequest = new StringRequest(Request.Method.GET, URLstring,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("strrrrr", ">>" + response);
try {
JSONObject obj = new JSONObject(response);
if(obj.optString("status").equals("true")){
dataModelArrayList = new ArrayList<>();
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
DataModel playerModel = new DataModel();
JSONObject dataobj = dataArray.getJSONObject(i);
playerModel.setTitle(dataobj.getString("title"));
playerModel.setShortdesc(dataobj.getString("shortdesc"));
playerModel.setImage(dataobj.getString("image"));
dataModelArrayList.add(playerModel);
}
setupListview();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//displaying the error in toast if occurrs
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
// request queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
private void setupListview(){
removeSimpleProgressDialog(); //will remove progress dialog
listAdapter = new ListAdapter(this, dataModelArrayList);
listView.setAdapter(listAdapter);
}
public static void removeSimpleProgressDialog() {
try {
if (mProgressDialog != null) {
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
} catch (IllegalArgumentException ie) {
ie.printStackTrace();
} catch (RuntimeException re) {
re.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void showSimpleProgressDialog(Context context, String title,
String msg, boolean isCancelable) {
try {
if (mProgressDialog == null) {
mProgressDialog = ProgressDialog.show(context, title, msg);
mProgressDialog.setCancelable(isCancelable);
}
if (!mProgressDialog.isShowing()) {
mProgressDialog.show();
}
} catch (IllegalArgumentException ie) {
ie.printStackTrace();
} catch (RuntimeException re) {
re.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
recyclerview.php
<?php
//database constants
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'recyclerview');
//connecting to database and getting the connection object
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
//Checking if any error occured while connecting
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
die();
}
//creating a query
$stmt = $conn->prepare("SELECT id, title, shortdesc, image FROM products;");
//executing the query
$stmt->execute();
//binding results to the query
$stmt->bind_result($id, $title, $shortdesc, $image);
$products = array();
//traversing through all the result
while($stmt->fetch()){
$temp = array();
$temp['id'] = $id;
$temp['title'] = $title;
$temp['shortdesc'] = $shortdesc;
$temp['image'] = $image;
array_push($products, $temp);
}
//displaying the result in json format
echo json_encode($products);
?>
Upvotes: 0
Views: 102
Reputation: 5190
Current version of your server script produces the JSON response in the following format.
[
{
"id": 123,
"title": "some title",
"shortdesc": "description here",
"image": "image here"
},
{
"id": 124,
"title": "some other title",
"shortdesc": "description here",
"image": "image here"
}
]
Which is JSONArray not JSONObject. Whereas, in your Android app code you're expecting a JSON response like below,
{
"status": "true",
"data": [
{
"id": 123,
"title": "some title",
"shortdesc": "description here",
"image": "image here"
},
{
"id": 124,
"title": "some other title",
"shortdesc": "description here",
"image": "image here"
}
]
}
In PHP code just do the following adjustments,
<?php
// other code here ...
//traversing through all the result
while($stmt->fetch()){
$temp = array();
$temp['id'] = $id;
$temp['title'] = $title;
$temp['shortdesc'] = $shortdesc;
$temp['image'] = $image;
array_push($products, $temp);
}
// create an array and add required key-values
$response = array();
$response["status"] = "true";
$response["data"] = $products;
//displaying the result in json format
// pass $response array to json_encode() method
echo json_encode($response);
?>
Upvotes: 1