Search code examples
androidjsonlistviewandroid-arrayadaptergoogle-books

ListView not getting populated from the Adapter


This app is used to fetch the books as JSON using Google Books API and on research I also found that the JSON data is loading fine and the Book Title, Author is parsed correctly and I tested that using toasts. But the listView is not showing up even from setting the listView with the adapter. What must be the error? The app also doesn't crash making it little difficult to troubleshoot. Thanks in advance!

Main Activity

package com.praveent.booklisting;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;

public class MainActivity extends AppCompatActivity {

    public String rootUrl = "https://www.googleapis.com/books/v1/volumes";
    public String queryParameter = "q";
    Button search_button;
    EditText search_string;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list_view);
        search_button = (Button) findViewById(R.id.search_button);
        search_string = (EditText) findViewById(R.id.search_string);
        search_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String query = search_string.getText().toString();
                ConnectivityManager connectivityManager
                        = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
                if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){
                    new BackgroundTask().execute(query);
                }
                else{
                    Toast.makeText(MainActivity.this, "Please switch on the internet!", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    public void populate(BookAdapter adapter){
        listView.setAdapter(adapter);
    }

    public class BackgroundTask extends AsyncTask<String, JSONArray, String> {

        @Override
        protected String doInBackground(String... strings) {
            String query = strings[0];
            URL url = null;
            Uri uri = Uri.parse(rootUrl).buildUpon().appendQueryParameter(queryParameter, query).build();
            try {
                url = new URL(uri.toString());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            String data = null;
            try {
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                InputStream in = urlConnection.getInputStream();
                Scanner scanner = new Scanner(in);
                scanner.useDelimiter("\\A");
                if(scanner.hasNext()){
                    data = scanner.next();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return data;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            BookAdapter bookAdapter;
            JSONObject jsonObject = null;
            JSONArray jsonArray = null;
            JSONObject jsonArrayObject = null;
            JSONObject volumeInfo = null;
            JSONArray authorInfo = null;
            JSONObject imageInfo = null;
            String imageUrl = null;
            String bookTitle = null;
            String bookAuthor = null;
            try {
                jsonObject = new JSONObject(s);
                jsonArray = jsonObject.getJSONArray("items");
                ArrayList<Book> books= new ArrayList<Book>();
                for(int i = 0; i <= jsonArray.length(); i++){
                    jsonArrayObject = jsonArray.getJSONObject(i);
                    volumeInfo = jsonArrayObject.getJSONObject("volumeInfo");
                    bookTitle = volumeInfo.getString("title");
                    authorInfo = volumeInfo.getJSONArray("authors");
                    bookAuthor = " ";
                    if (authorInfo != null){
                        bookAuthor = authorInfo.getString(0);
                    }
                    //imageInfo = volumeInfo.getJSONObject("imageLinks");
                    //imageUrl = imageInfo.getString("smallThumbnail");
                    books.add(new Book(bookTitle, bookAuthor));
                    Toast.makeText(MainActivity.this, bookAuthor, Toast.LENGTH_SHORT).show();
                }
                bookAdapter = new BookAdapter(MainActivity.this, books);
                populate(bookAdapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

Book Adapter

package com.praveent.booklisting;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;

public class BookAdapter extends ArrayAdapter<Book>{

    Context c = null;
    public BookAdapter(Context context, ArrayList<Book> books) {
        super(context, 0, books);
        c = context;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View listItemView = convertView;
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item, parent, false);
        }
        Book currentBook = getItem(position);
        TextView bookTextView = (TextView) listItemView.findViewById(R.id.book_name);
        bookTextView.setText(currentBook.getBookName());
        TextView authorTextView = (TextView) listItemView.findViewById(R.id.book_author);
        authorTextView.setText(currentBook.getAuthorName());
        //ImageView coverImageView = (ImageView) listItemView.findViewById(R.id.cover_image);
        //Picasso.with(c).load(currentBook.getImageURL()).into(coverImageView);
        return listItemView;
    }
}

Book Class

package com.praveent.booklisting;

public class Book {

    private String bookName;
    private String authorName;
    private String imageURL;

    public Book(String name, String author){
        bookName = name;
        authorName = author;
        //imageURL = url;
    }

    public String getBookName() {
        return bookName;
    }

    public String getAuthorName() {
        return authorName;
    }

    public String getImageURL() {
        return imageURL;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="com.praveent.booklisting.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:id="@+id/search_string"
        android:textAlignment="center"
        android:gravity="center"
        android:hint="@string/search_hint"/>

    <Button
        android:layout_width="match_parent"
        android:id="@+id/search_button"
        android:layout_height="wrap_content"
        android:text="@string/search_button" />
    <ListView
        android:layout_width="fill_parent"
        android:id="@+id/list_view"
        android:layout_height="fill_parent">
    </ListView>

</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:padding="8dp"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/cover_image"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/book_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#000"
            android:textSize="18sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textColor="#000"
            android:id="@+id/book_author"/>
    </LinearLayout>

</LinearLayout>

Solution

  • On PostExecute Change for(int i = 0; i <=jsonArray.length(); i++) to for(int i = 0;i<jsonArray.length(); i++) On list_item.xml change the text color to white