ArrayList с customArrayAdapter показывает только 1 список - PullRequest
1 голос
/ 24 января 2020

Я создал arraylist с customArrayAdapter, и при использовании фиктивных данных список был виден на экране без каких-либо ошибок, но когда я заменил фиктивные данные на JsonObject, где ответ json жестко закодирован как строковое значение в java file затем я обнаружил, что все данные правильно отображаются в списке, но на экране отображается только 1 элемент списка вместо 15, поскольку ответ содержит 15 объектов JsonArray. Я использовал для l oop для циклического перемещения по JsonArray, но я не знаю, в чем ошибка?

enter image description here

MainActivity. Java:

package com.example.anybookinfo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView bookListView = findViewById(R.id.bookListView);
        ArrayList<BookStore> bookStoreArrayList = HTTTP_REQUEST.readFromJson(HTTTP_REQUEST.jsonResponse);

        BookAdapter bookAdapter = new BookAdapter(this, bookStoreArrayList);

        bookListView.setAdapter(bookAdapter);
    }
}

HTTP_Request. java:

package com.example.anybookinfo;

import android.text.TextUtils;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class HTTTP_REQUEST {
public static ArrayList<BookStore> readFromJson(String jsonObject) {
        ArrayList<BookStore> currentBookStore = new ArrayList<>();
        if (TextUtils.isEmpty(jsonObject)) {
            return null;
        }
        try {
            JSONObject root = new JSONObject(jsonObject);
            JSONArray items = root.getJSONArray("items");
            for (int i = 0; i < items.length(); i++) {
                JSONObject currentBook = items.getJSONObject(i);
                JSONObject volumeInfo = currentBook.getJSONObject("volumeInfo");
                String fTitle = volumeInfo.getString("title");
                String lTitle = volumeInfo.getString("subtitle");
                JSONArray author = volumeInfo.getJSONArray("authors");
                String authorName = author.getString(0);
                int PageCount = volumeInfo.getInt("pageCount");
                JSONObject saleInfo = currentBook.getJSONObject("saleInfo");
                JSONObject listPrice = saleInfo.getJSONObject("listPrice");
                double amount = listPrice.getDouble("amount");
                String currencyCode = listPrice.getString("currencyCode");
                JSONObject searchInfo = currentBook.getJSONObject("searchInfo");
                String textSnippet = searchInfo.getString("textSnippet");
                BookStore bookStore = new BookStore(fTitle, lTitle, authorName, textSnippet, PageCount, amount, currencyCode);
                currentBookStore.add(bookStore);
            }
        } catch (JSONException j) {
            Log.e("readFromJson Error", "error in reading the json response", j);
        }
        return currentBookStore;
    }
 public static final String jsonResponse = "  //the json response code is here " ;
}

Фактическая json ссылка ответа, которая жестко закодирована: https://www.googleapis.com/books/v1/volumes?q=Inner%20Engineering%20:% 20a% 20yogi% 27s% 20 гид% 20to% 20joy & maxResults = 15

Ошибка LogCat:

01-24 23:18:46.030 3693-3703/? E/art: Failed sending reply to debugger: Broken pipe
01-24 23:18:46.243 3693-3693/? E/readFromJson Error: error in reading the json response
    org.json.JSONException: No value for listPrice
        at org.json.JSONObject.get(JSONObject.java:389)
com.example.anybookinfo.HTTTP_REQUEST.readFromJson(HTTTP_REQUEST.java:58)
        at com.example.anybookinfo.MainActivity.onCreate(MainActivity.java:18)

MainActivity. java: 18 строк содержат:

ArrayList<BookStore> bookStoreArrayList = HTTTP_REQUEST.readFromJson(HTTTP_REQUEST.jsonResponse);

HTTTP_REQUEST. java: 58 строк содержат:

 JSONObject listPrice = saleInfo.getJSONObject("listPrice");

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Спасибо за сообщение об ошибке logcat. Это причина того, что ваши предметы не отображаются на экране. Посмотрев предоставленные вами данные json, вы должны выполнить нулевую проверку на listPrice перед их обработкой, поскольку некоторые элементы в saleInfo не имеют этого поля. Поэтому вместо этой строки:

JSONObject listPrice = saleInfo.getJSONObject("listPrice");

сделайте: JSONObject listPrice = saleInfo.optJSONObject("listPrice");

, а затем выполните проверку на ноль listPrice:

Double amount = null;
String currencyCode = null;

if(listPrice != null) {
    amount = listPrice.getDouble("amount");
    currencyCode = listPrice.getString("currencyCode");
}

Нет необходимости добавлять еще один внутренний try / catch. Кроме того, вам нужно использовать класс Double, поскольку существует вероятность наличия нулевого значения, а также потому, что ваш конструктор Bookstore передает это поле.

Если есть другие поля, которые имеют потенциал из-за отсутствия в ответе json вам нужно будет также добавить нулевые проверки для этих объектов JSONObject.

1 голос
/ 24 января 2020

Спасибо { ссылка } за ответ. И спасибо { ссылка } за указание на фактическую ошибку при использовании opt вместо get. После исправления этой ошибки я обнаружил более похожую ошибку, для которой не было назначено никакого значения, и я использовал optString, OptObject вместо getString, get Json и назначил значение по умолчанию, когда значение отсутствует.

Вот изменения, которые я внес в метод readFrom Json для устранения ошибки:

   public static ArrayList<BookStore> readFromJson(String jsonObject) {
    ArrayList<BookStore> currentBookStore = new ArrayList<>();
    if (TextUtils.isEmpty(jsonObject)) {
        return null;
    }
    try {
        double amount=0;
        String currencyCode = "Not Available";
        String textSnippet = "No Description Available";
        JSONObject root = new JSONObject(jsonObject);
        JSONArray items = root.getJSONArray("items");
        for (int i = 0; i < items.length(); i++) {

            JSONObject currentBook = items.getJSONObject(i);
            JSONObject volumeInfo = currentBook.getJSONObject("volumeInfo");
            String fTitle = volumeInfo.getString("title");
            String lTitle = volumeInfo.optString("subtitle");
            JSONArray author = volumeInfo.getJSONArray("authors");
            String authorName = author.getString(0);
            int PageCount = volumeInfo.getInt("pageCount");
            JSONObject saleInfo = currentBook.getJSONObject("saleInfo");

                JSONObject listPrice =saleInfo.optJSONObject("listPrice");
                if(listPrice != null) {
                    amount = listPrice.getDouble("amount");
                    currencyCode = listPrice.getString("currencyCode");
                             }
                JSONObject searchInfo = currentBook.optJSONObject("searchInfo");
                if (searchInfo!=null){
                    textSnippet = searchInfo.optString("textSnippet");
                }
            BookStore bookStore = new BookStore(fTitle, lTitle, authorName, textSnippet, PageCount, amount, currencyCode);


            currentBookStore.add(bookStore);
        }
    } catch (JSONException j) {
        Log.e("readFromJson Error", "error in reading the json response", j);
    }
    return currentBookStore;
}

enter image description here

...