Как отобразить полученные данные json в listview с помощью arrayadapter

Я хочу, чтобы в моем приложении отображались названия книг, полученных с GoogleBooks с помощью volley. Я не могу понять, что делаю не так. Когда я запускаю приложение и ищу книгу, оно ничего не обновляет на ListView. В logcat отлично показывает названия книг. Пожалуйста, помогите мне отобразить полученные данные в ListView.

это мой основной xml файл

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:padding="10dp">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter the  Author's name. "
        android:padding="10dp" />

    <Button
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@+id/edit_text"
        android:text="Search"
        android:layout_alignRight="@+id/edit_text" />

    <TextView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="@string/noDataFound"
        android:layout_below="@+id/edit_text"
        tools:visibility="visible"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" />


    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

**this is my list_ite xml file**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <TextView
        android:id="@+id/result1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="title here"/>

    <TextView
        android:id="@+id/result2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="authors here" />

</LinearLayout>

**This is my MainActivity.java file**

package com.example.manuj.booklistingthisone;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;

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

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    //Declaration of variables
    EditText author;
    Button search;
    TextView result1;
   // TextView result2;
    ListView listView;
   BooksAdapter booksAdapter;

    //Declaration of URL
    String baseUrl=" https://www.googleapis.com/books/v1/volumes?q=search+";
    String API="&appid=AIzaSyDSP4GIpZsirfBnT1eRtkZypn2Qvca4RAw";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        author=(EditText)findViewById(R.id.edit_text);
        search=(Button)findViewById(R.id.search);
        result1=(TextView)findViewById(R.id.result1);
       // result2=(TextView) findViewById(R.id.result2);

        booksAdapter=new BooksAdapter(this,-1);

        listView=(ListView)findViewById(R.id.listView);
        listView.setAdapter(booksAdapter);
        final ArrayList<Book> books=new ArrayList<>();

        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String myUrl=baseUrl+author.getText().toString()+API;
                Log.i("URL","UR URL IS"+myUrl);


                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
                        (Request.Method.GET, myUrl,null, new Response.Listener<JSONObject>() {

                            public void onResponse(JSONObject response) {
                                Log.i("response","response"+response);

                                try {
                                    String info=response.getString("items");
                                    JSONArray jsonArray=new JSONArray(info);
                                    for(int i=0;i<jsonArray.length();i++){
                                        JSONObject parObj=jsonArray.getJSONObject(i);
                                        String vol=parObj.getString("volumeInfo");
                                        JSONObject ti=new JSONObject(vol);
                                        String titles=ti.getString("title");
                                        Log.i("FINAL","FINAL IS "+titles);
                                        Book book=new Book(titles);
                                        books.add(book);

                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        }, new Response.ErrorListener() {

                            @Override
                            public void onErrorResponse(VolleyError error) {
                                // TODO: Handle error

                            }
                        });

                MySingleton.getInstance(MainActivity.this).addToRequestQue(jsonObjectRequest);
            }
        });
    }
}

**This is my Book.java file**
package com.example.manuj.booklistingthisone;

public class Book {
    //title for the book
    private String mTitle;
    //author of the book
  //  private String mAuthor;

    public Book(String title){
        mTitle=title;
       // this.mAuthor=author;

    }


    // public String getAuthor() {return mAuthor;}

    public String getTitle() {
        return mTitle;
    }
}

**This is my ArrayAdapter.java file**

package com.example.manuj.booklistingthisone;

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

public class BooksAdapter extends ArrayAdapter<Book> {
    public BooksAdapter(Context context, int resource) {
        super(context, resource);
    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {

        Book book = getItem(position);

        if (view == null){
            view = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item, parent, false);
        }

        TextView title = (TextView) view.findViewById(R.id.result1);
       // TextView author = (TextView) view.findViewById(R.id.result2);
        title.setText(book.getTitle());
       // author.setText(book.getAuthor());

        return view;
    }
}

**This is my Singleton.java file**

package com.example.manuj.booklistingthisone;

import android.content.Context;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by studio on 14/06/17.
 */

public class MySingleton {

    private static MySingleton mInstance;
    private RequestQueue requestQueue;
    private static Context mCtx;

    private MySingleton(Context context){
        mCtx = context;
        requestQueue = getRequestQueue();
    }

    public RequestQueue getRequestQueue(){
        if(requestQueue==null){
            requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return requestQueue;
    }

    public static synchronized MySingleton getInstance(Context context){
        if(mInstance==null){
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public void addToRequestQue(Request request){
        requestQueue.add(request);
    }
}

Привет. Я не вижу, где ваши книги, Адаптер берут книги ...

Bruno 10.08.2018 15:50

Как указано ниже в AndroidTeam, вам необходимо изменить свой общедоступный конструктор, чтобы приспособить его к List<Book>, и добавить переменную класса «data», но в целом вам следует рассмотреть возможность использования RecyclerView вместо ListView.

Barns 10.08.2018 16:22
0
2
301
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это изменить ..

public class BooksAdapter extends ArrayAdapter<Book> {

Context context;
List<Book> data = null;

  public BooksAdapter(Context context, int resource,List<Book> data) {
    super(context, resource);
   this.context = context;
    this.data = data;
  }

также при получении хранилища данных в списке после этого определите адаптер и передайте этот список, а затем привяжите адаптер к списку.

getItem (позиция); экземпляр data.get (позиция).

Android Team 10.08.2018 16:37
Ответ принят как подходящий

1. Создайте список книг, а затем передайте его в BaseAdapter.

    final ArrayList<Book> books=new ArrayList<>();
    booksAdapter=new BooksAdapter(this,-1, books);
    listView=(ListView)findViewById(R.id.listView);
    listView.setAdapter(booksAdapter);

2. Измените конструктор базового адаптера, который должен принимать список книг.

public BooksAdapter(Context context, int resource, ArrayList<Book> books) {
    super(context, resource, books);
}

3.После получения данных от сервера вызовите booksAdapter.notifyDataSetChanged() Надеюсь, это решит вашу проблему.

Другие вопросы по теме