Не удается отобразить данные в recyclerView - PullRequest
0 голосов
/ 08 мая 2020

Это приложение должно отображать заголовки mov ie, полученные из API в RecyclerView. Я знаю, что получаю данные правильно из-за журналов, которые я сделал для фильмов Arraylist, но по какой-то причине я не могу отобразить информацию. Приложение не сканирует sh, просто показывает пустой вид. Я действительно ценю вашу помощь.

Отказ от ответственности: Я новичок ie, и это решение может быть довольно простым для опытных людей. Обычно я не задаю вопросов, если не могу решить проблему, на самом деле это мой первый вопрос. Я занимаюсь этим уже несколько дней и не могу найти способ. Я понимаю, что в этом коде может быть несколько проблем, и вы можете указать на них все.

Итак, это моя основная деятельность


import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

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.nio.charset.Charset;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


    public static final String LOG_TAG = MainActivity.class.getSimpleName();

    private static final String MOST_POPULAR_MOVIES = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=XXXXXXXXXXXXXXXXXXX";
    ArrayList<Pelicula> ArrayDePeliculas;
    private RecyclerView mPelisList;
    private AdapterRV adapterRV;

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

        PeliculasAsyncTask task = new PeliculasAsyncTask();
        task.execute(createUrl(MOST_POPULAR_MOVIES));


        adapterRV = new AdapterRV(getApplicationContext(),/*Aca puede faltar algo*/ new ArrayList<Pelicula>());
        mPelisList = findViewById(R.id.rv_pelis);


        GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
        mPelisList.setLayoutManager(layoutManager);

        mPelisList.setAdapter(adapterRV);

    }

    public void updateUi(ArrayList<Pelicula> peliculas) {


    }

    /**
     * Returns new URL object from the given string URL.
     */
    private URL createUrl(String stringUrl) {
        URL url = null;
        try {
            url = new URL(stringUrl);
        } catch (MalformedURLException exception) {
            Log.e(LOG_TAG, "Error with creating URL", exception);
            return null;
        }
        return url;
    }

    /**
     * Make an HTTP request to the given URL and return a String as the response.
     */
    private String makeHttpRequest(URL url) throws IOException {
        String jsonResponse = "";

        // If the URL is null, then return early.
        if (url == null) {
            return jsonResponse;
        }

        HttpURLConnection urlConnection = null;
        InputStream inputStream = null;
        try {
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setReadTimeout(10000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.connect();

            // If the request was successful (response code 200),
            // then read the input stream and parse the response.
            if (urlConnection.getResponseCode() == 200) {
                inputStream = urlConnection.getInputStream();
                jsonResponse = readFromStream(inputStream);
            } else {
                Log.e(LOG_TAG, "Error response code: " + urlConnection.getResponseCode());
            }
        } catch (IOException e) {
            Log.e(LOG_TAG, "Problem retrieving the earthquake JSON results.", e);
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (inputStream != null) {
                // function must handle java.io.IOException here
                inputStream.close();
            }
        }
        return jsonResponse;
    }

    /**
     * Convert the {@link InputStream} into a String which contains the
     * whole JSON response from the server.
     */
    private String readFromStream(InputStream inputStream) throws IOException {
        StringBuilder output = new StringBuilder();
        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
            BufferedReader reader = new BufferedReader(inputStreamReader);
            String line = reader.readLine();
            while (line != null) {
                output.append(line);
                line = reader.readLine();
            }
        }
        return output.toString();
    }

    /**
     * TODO modificar la url que le estas pasando
     */
    public ArrayList<Pelicula> extractFeatureFromJson(String jsonResponse) {

        ArrayList<Pelicula> arraydePelis = new ArrayList<>();

        try {
            JSONObject baseJsonResponse = new JSONObject(jsonResponse);
            JSONArray resultsArray = baseJsonResponse.getJSONArray("results");

            for (int i = 0; i < resultsArray.length(); i++) {
                // If there are results in the features array

                if (resultsArray.length() > 0) {
                    // Extract out the first feature (which is an earthquake)
                    JSONObject firstResult = resultsArray.getJSONObject(i);
                    String tittle = firstResult.getString("title");

                    Pelicula pelicula = new Pelicula(tittle);
                    arraydePelis.add(pelicula);
                }

            }
        } catch (JSONException e) {
            Log.e(LOG_TAG, "Problem parsing the earthquake JSON results", e);
        }
        return arraydePelis;
    }

    private class PeliculasAsyncTask extends AsyncTask<URL, Void, ArrayList<Pelicula>> {

        @Override
        protected ArrayList<Pelicula> doInBackground(URL... urls) {
            // Create URL object
            URL url = createUrl(MOST_POPULAR_MOVIES);


            // Perform HTTP request to the URL and receive a JSON response back
            String jsonResponse = "";
            try {
                jsonResponse = makeHttpRequest(url);
            } catch (IOException e) {
                Log.e(LOG_TAG, "Problem making the HTTP request.", e);
            }

            // Extract relevant fields from the JSON response and create an {@link Event} object
            ArrayList<Pelicula> ArrayPeliculas = extractFeatureFromJson(jsonResponse);


            // Return the {@link Event} object as the result fo the {@link TsunamiAsyncTask}
            return ArrayPeliculas;
        }


        @Override
        protected void onPostExecute(ArrayList<Pelicula> data) {
            if (data == null) {
                return;
            }

            adapterRV.notifyDataSetChanged();
            mPelisList.setAdapter(adapterRV);
            Log.e("Nada", data.get(6).getTittle());
            super.onPostExecute(data);
        }


    }

}

The Mov ie класс


public class Pelicula {

    //Fields
    private String mTittle;

    //Constructor
    public Pelicula(String Tittle){
        mTittle= Tittle;
    }


    //Methods

    public String getTittle (){

        return mTittle;
    }
}

И, наконец, адаптер recyclerView


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

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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

public class AdapterRV extends RecyclerView.Adapter<AdapterRV.PelisViewHolder> {

    //Fields

    List<Pelicula> mPeliculas;

    private Context context;

    /* TODO, comprobar que no necesitas esto:  mNumberItems = numberOfItems; y poner autofit en grid view */

    //Constructor

    public AdapterRV (Context context, ArrayList<Pelicula> peliculas){

        mPeliculas = peliculas;
        this.context= context;
    }


    //Metodos

    @NonNull
    @Override
    public PelisViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        int layoutForListItem = R.layout.item_layout;
        LayoutInflater inflater= LayoutInflater.from(context);

        View view = inflater.inflate(layoutForListItem, parent, false);
        PelisViewHolder viewHolder = new PelisViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull PelisViewHolder holder, int position) {

        Pelicula peliculas = mPeliculas.get(position);
        TextView textView = holder.listItemTittleView;
        textView.setText(peliculas.getTittle());



    }

    @Override
    public int getItemCount() {
        return mPeliculas.size();
    }






    public class PelisViewHolder extends RecyclerView.ViewHolder{
        TextView listItemTittleView;

        public PelisViewHolder(@NonNull View itemView) {
            super(itemView);
            listItemTittleView = itemView.findViewById(R.id.tv_title);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вы видите эти 2 строки в onCreate()

adapterRV = new AdapterRV(getApplicationContext(),new ArrayList<Pelicula>());
...
...

mPelisList.setAdapter(adapterRV);

Переместите их в onPostExecute() asyncTask и передайте data вместо new ArrayList<Pelicula>():

    @Override
    protected void onPostExecute(ArrayList<Pelicula> data) {

       //assuming the list is full and all is good

        if (data == null) {
            return;
        }
        //here...
        adapterRV = new AdapterRV(getApplicationContext(),data);
        mPelisList.setAdapter(adapterRV);
        Log.e("Nada", data.get(6).getTittle());

        super.onPostExecute(data);
    }

ОБНОВЛЕНИЕ:

Это потому, что вы не инициализируете список в адаптере:

public class AdapterRV extends RecyclerView.Adapter<AdapterRV.PelisViewHolder> {

    //Fields

    //here you must initialize like this:
    List<Pelicula> mPeliculas = new ArrayList<Pelicula>();
    .....
0 голосов
/ 08 мая 2020

Проблема в том, что вы передаете new ArrayList<Pelicula>() своему адаптеру, а этот список остается пустым. Я предлагаю вам объявить глобальную ссылку на список Pelicula внутри вашего MainActivity, а затем передать его адаптеру. Каждый раз, когда этот список изменяется, notifyDataSetChanged.

Если вы не хотите объявлять глобальную ссылку, просто объявите метод внутри вашего адаптера:

publi c void setList (ArrayList список) {this.list = список; }

и в MainActivity, просто все, что вы получаете, новый список, setList(newPeliculaList) и adapterRV.notifyDataSetChanged()

Отредактируйте:

в onCreate() перед объявлением AdapterRV:

просто укажите это:

ArrayDePeliculas = new ArrayList<Pelicula>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...