Search code examples
androidjsonlistviewkotlingoogle-books

Populate Listview from Google Books JSON


I'm using Google Books API for searching books. But problem is that when I want my ListView to be populated with books, I get an error. This error is pointed onPostExecute, but I can't figured out what's the problem.

 kotlin.KotlinNullPointerException
    at com.example.claudiu.reader.Fragments.ISBNFragment$FetchBookTask.onPostExecute(ISBNFragment.kt:137)
    at com.example.claudiu.reader.Fragments.ISBNFragment$FetchBookTask.onPostExecute(ISBNFragment.kt:56)

Here is where I set my adapter :

 override fun onPostExecute(books: List<Book>?) {
        if (books != null) {
            adapter!!.clear()
            for (book in books) {
                adapter!!.add(book)
            }
        }
    }

And here is all code where I'm parsing the JSON:

  @Throws(JSONException::class)
    private fun getBookDataFromJson(booksJsonStr: String?): List<Book> {

        val books = ArrayList<Book>()

        val API_RESULT_ITEMS_ARRAY = "items"
        val API_VOLUME_INFO = "volumeInfo"
        val API_BOOK_TITLE = "title"
        val API_BOOK_IMAGE_LINKS = "imageLinks"
        val API_BOOK_SMALL_THUMBNAIL = "smallThumbnail"
        val API_BOOK_AUTHORS_ARRAY = "authors"

        val booksJson = JSONObject(booksJsonStr)
        val itemsArray = booksJson.getJSONArray(API_RESULT_ITEMS_ARRAY)

        for (i in 0 until itemsArray.length()) {

            val item = itemsArray.getJSONObject(i)
            val volumeInfo = item.getJSONObject(API_VOLUME_INFO)

            val bookTitle = volumeInfo.getString(API_BOOK_TITLE)

            val imageLinksSB = StringBuilder()
            if (!volumeInfo.isNull(API_BOOK_IMAGE_LINKS)) {
                val imageLinks = volumeInfo.getJSONObject(API_BOOK_IMAGE_LINKS)
                imageLinksSB.append(imageLinks.getString(API_BOOK_SMALL_THUMBNAIL))
            } else {
                imageLinksSB.append("-1")
            }
            val bookImageLink = imageLinksSB.toString()

            val authorsSB = StringBuilder()
            if (!volumeInfo.isNull(API_BOOK_AUTHORS_ARRAY)) {
                val authorsArray = volumeInfo.getJSONArray(API_BOOK_AUTHORS_ARRAY)
                for (k in 0 until authorsArray.length()) {
                    authorsSB.append(authorsArray.getString(k))
                    authorsSB.append(getString(R.string.comma))
                }
            } else {
                authorsSB.append(getString(R.string.unknown_error))
            }
            val bookAuthors = authorsSB.toString()

            books.add(Book(bookTitle, bookAuthors, bookImageLink))
        }

        Log.d(LOG_TAG, "BOOKS : $books")
        return books
    }

I couldn't find any thing to help me and I have no idea what should I do.


Solution

  • Your problem is the place where you declare your adapter, I had this problem because declaration of my adapter was in the wrong place.

    You should move adapter declaration from onCreatView into onViewCreated and everything will work fine.

    Hope it helps !