Item RecyclerView para carregar outro RecyclerView com JSON aninhado

Estou desenvolvendo um aplicativo mostrando oLista de Cinemas e também oLista de exibição de filmes em cada cinema. Quero usar 2 RecyclerViews,1 primeiro Lista os nomes dos cinemas eSegundo Um vem depois de clicar noFilmes item Do primeiro RecyclerView.

Eu uso umJSON aninhado para recuperar as informações e recuperei a lista de cinemas com êxito, mas não recebo filmes correspondentes no Second RecyclerView.

AulasCinema eCinemaAdapter são responsáveis pela recuperação de CinemaNames e Filmes usando oJSONArray, mas quero que os filmes sejam exibidos no Second RecyclerView (LoadingMovies.java classe eLoadingMoviesAdapter.java são responsáveis pelo segundo RecyclerView). AulasLoadingMovies.java eLoadingMovies.java são responsáveis por obter dados do CinemaAdapter após um clique paraMostrar a lista de filmes. (Geralmente, quero que cada cinema recarregue seus filmes de acordo com o JSON) Atualmente, recebo os dois filmes em todos os cinemas, deixando o resto não exibido.

Abaixo está o meu JSON aninhado:

 [
  {
    "Cinemax": "Blue Ray",
    "Contacts": "0704594180",
    "CinemaxPhoto": "huzy.jpg",
    "Longitude": "32.89577584",
    "Latitude": "0.46378484",
    "Movie": [
      {
        "MovieName": "Ice Age 3",
        "Synopsis": "Manny, Diego and sid",
        "photo": "ice_age_3.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "1:30 p.m , 3:40 p.m",
          "Tuesday": "1:30 pm , 3:40 p.m",
          "Wednesday": "1:30 p.m., 3:40 p.m",
          "Thursday": "1:30 p.m., 3:40 p.m",
          "Friday": "1:30 p.m., 3:40 p.m",
          "Saturday": "1:30 p.m., 3:40 p.m",
          "Sunday": "1:30 p.m., 3:40 p.m"
        }
      },
      {
        "MovieName": "Zootopia",
        "Synopsis": "Manny, Diego and sid",
        "photo": "zootopia.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "4:30 p.m , 6:30 p.m",
          "Tuesday": "4:30 p.m , 6:30 p.m",
          "Wednesday": "4:30 p.m , 6:30 p.m",
          "Thursday": "4:30 p.m , 6:30 p.m",
          "Friday": "4:30 p.m , 6:30 p.m",
          "Saturday": "4:30 p.m , 6:30 p.m",
          "Sunday": "4:30 p.m , 6:30 p.m"
        }
      },
      {
        "MovieName": "Madaari",
        "Synopsis": "Nirmal loses his family in a man-made disaster, he starts the journey of seeking answers asking for accountabilty, for sure am a genius , lets try out and see whether this will work out, horaay , i dont know , me am confused ",
        "photo": "madaari.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "6:30 p.m , 8:30 p.m",
          "Tuesday": "6:30 p.m , 8:30 p.m",
          "Wednesday": "6:30 p.m , 8:30 p.m",
          "Thursday": "6:30 p.m , 8:30 p.m",
          "Friday": "6:30 p.m , 8:30 p.m",
          "Saturday": "6:30 p.m , 8:30 p.m",
          "Sunday": "6:30 p.m , 8:30 p.m"
        }
      },
      {
        "MovieName": "Me Before You",
        "Synopsis": "A girl in a small town forms an unlikely bond with a recently paralyzed man she is taking care of.",
        "photo": "me_before_you.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "8:30 p.m , 11:30 p.m",
          "Tuesday": "8:30 p.m , 11:30 p.m",
          "Wednesday": "8:30 p.m , 11:30 p.m",
          "Thursday": "8:30 p.m , 11:30 p.m",
          "Friday": "8:30 p.m , 11:30 p.m",
          "Saturday": "8:30 p.m , 11:30 p.m",
          "Sunday": "8:30 p.m , 11:30 p.m"
        }
      },
      {
        "MovieName": "Ghostbusters",
        "Synopsis": "Following a ghost invasion of Manhattan, paranormal enthusiasts Erin Gilbert and Abby Yates , nuclear engineer jillian Holtzmann",
        "photo": "ghost_busters.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "11:30 p.m , 1:30 a.m",
          "Tuesday": "11:30 p.m , 1:30 a.m",
          "Wednesday": "11:30 p.m , 1:30 a.m",
          "Thursday": "11:30 p.m , 1:30 a.m",
          "Friday": "11:30 p.m , 1:30 a.m",
          "Saturday": "11:30 p.m , 1:30 a.m",
          "Sunday": "11:30 p.m , 1:30 a.m"
        }
      }
    ]
  },
  {
    "Cinemax": "White Down",
    "Contacts": "0700304850",
    "CinemaxPhoto": "hello.jpg",
    "Longitude": "32.89577584",
    "Latitude": "0.46378484",
    "Movie": [
      {
        "MovieName": "The Legend Of Tarzan",
        "Synopsis": "Tarzan , having acclimated to life in London, is called back to his former home in the jungle to investigate",
        "photo": "legend_of_tarzan.jpg",
        "others": null,
        "ShowTime": {
          "Monday": "11:30 p.m , 1:30 a.m",
          "Tuesday": "11:30 p.m , 1:30 a.m",
          "Wednesday": "11:30 p.m , 1:30 a.m",
          "Thursday": "11:30 p.m , 1:30 a.m",
          "Friday": "11:30 p.m , 1:30 a.m",
          "Saturday": "11:30 p.m , 1:30 a.m",
          "Sunday": "11:30 p.m , 1:30 a.m"
        }
      }
    ]
  }
]

Este é meuCinema.java classe

public class Cinemas
        extends AppCompatActivity {
    private static final String TAG = "RecyclerViewExample";
    private List<ItemObjects> feedsList;
    private RecyclerView mRecyclerView;
    private CinemaAdapter adapter;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cinemas);
        Bundle bundle = new Bundle();
        //
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Cinemax List");

        // Initialize recycler view
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        progressBar = (ProgressBar) findViewById(R.id.progress_bar);
        progressBar.setVisibility(View.VISIBLE);

        // Downloading data from below url
        // internet connectivity........
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();

        final String url = "http://10.0.2.2/UgandaEntertainment/Cinema/fetch.php";
        if(netInfo != null && netInfo.isConnectedOrConnecting()) {
            new AsyncHttpTask().execute(url);
        } else {
            Toast.makeText(this, "No network connection! , please check your connectivity", Toast.LENGTH_LONG).show();
        }
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public class AsyncHttpTask
            extends AsyncTask<String, Void, Integer> {

        @Override
        protected void onPreExecute() {
            setProgressBarIndeterminateVisibility(true);
        }

        @Override
        protected Integer doInBackground(String... params) {
            Integer result = 0;
            HttpURLConnection urlConnection;
            try {
                URL url = new URL(params[0]);
                urlConnection = (HttpURLConnection) url.openConnection();
                int statusCode = urlConnection.getResponseCode();
                // 200 represents HTTP OK
                if(statusCode == 200) {
                    BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while((line = r.readLine()) != null) {
                        response.append(line);
                    }
                    parseResult(response.toString());
                    result = 1; // Successful
                } else {
                    result = 0; //"Failed to fetch data!";
                }
            } catch(Exception e) {
                Log.d(TAG, e.getLocalizedMessage());
            }
            return result; //"Failed to fetch data!";
        }

        @Override
        protected void onPostExecute(Integer result) {
            // Download complete. Let us update UI
            progressBar.setVisibility(View.GONE);
            if(result == 1) {
                adapter = new CinemaAdapter(Cinemas.this, feedsList);
                mRecyclerView.setAdapter(adapter);
            } else {
                Toast.makeText(Cinemas.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void parseResult(String result) {
        try {
            JSONArray ar = new JSONArray(result);
            feedsList = new ArrayList<>();
            for(int i = 0; i < ar.length(); i++) {
                JSONObject obj = ar.getJSONObject(i);
                ItemObjects item = new ItemObjects();

                item.setCinemaName(obj.optString("Cinemax"));
                item.setContact(obj.optString("Contacts"));
                item.setCinemaxPhoto(obj.optString("CinemaxPhoto"));
                item.setLongitude(obj.optString("Longitude"));
                item.setLatitude(obj.optString("Latitude"));
                //Here you have another Movie Json Array so get it in JSONArray
                JSONArray movieArray = obj.getJSONArray("Movie");
                //get the first object of Movie  JSONArray and use it.
                JSONObject movieObject = movieArray.getJSONObject(0);
                item.setMovieName(movieObject.optString("MovieName"));
                //This JSOn object to get SHOWTIME object
                JSONObject showTime = movieObject.getJSONObject("ShowTime");
                item.setMonday(showTime.optString("Monday"));
                item.setTuesday(showTime.optString("Tuesday"));
                item.setWednesday(showTime.optString("Wednesday"));
                item.setThursday(showTime.optString("Thursday"));
                item.setFriday(showTime.optString("Friday"));
                item.setSaturday(showTime.optString("Saturday"));
                item.setSunday(showTime.optString("Sunday"));
                item.setSynopsis(movieObject.optString("Synopsis"));
                item.setPhoto(movieObject.optString("photo"));
                feedsList.add(item);
            }
        } catch(JSONException e) {
            e.printStackTrace();
        }
    }
}

Este é meuCinemaAdapter.java Classe. NoonBindViewHolder() método, tento enviar oMovieName,MovieImage,... enviá-los para o 2º RecyclerView, que é mantido peloLoadingMovies.java para recarregar uma lista de filmes no 2ndRecyclerView.

public class CinemaAdapter
        extends RecyclerView.Adapter<CinemaViewHolders> {
    String url = "http://10.0.2.2/UgandaEntertainment/CinemaPics/";
    private List<ItemObjects> itemList = null;
    private Context context;

    private ArrayList<ItemObjects> arraylist;

    public CinemaAdapter(Context context, List<ItemObjects> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public CinemaViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cinema_list, parent, false);
        CinemaViewHolders rcv = new CinemaViewHolders(layoutView, context);
        return rcv;
    }

    public static String encodeTobase64(Bitmap image) {
        Bitmap immagex = image;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        immagex.compress(Bitmap.CompressFormat.JPEG, 90, baos);
        byte[] b = baos.toByteArray();
        String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
        // Log.e("LOOK", imageEncoded);
        return imageEncoded;
    }

    @Override
    public void onBindViewHolder(final CinemaViewHolders holder, final int position) {
        final ItemObjects feedItems = itemList.get(position);

        holder.root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //
                Intent intent = new Intent(CinemaAdapter.this.context, LoadingMovies.class);
                intent.putExtra(CinemaViewHolders.KEY_MOVIE_NAME, feedItems.getMovieName());
                intent.putExtra(CinemaViewHolders.KEY_MOVIE_IMAGE, feedItems.getPhoto());
                intent.putExtra(CinemaViewHolders.KEY_CINEMA_NAME, feedItems.getCinemaName());
                //
                context.startActivity(intent);
            }
        });

        //Download image using picasso library
        Picasso.with(context).load(url + feedItems.getCinemaxPhoto()).error(R.drawable.placeholder).
                resize(500, 500).placeholder(R.drawable.placeholder).into(holder.countryPhoto);
        holder.countryName.setText(itemList.get(position).getCinemaName());
    }

    @Override
    public int getItemCount() {
        return (null != itemList ? itemList.size() : 0);
    }
}

Isto é oLoadingMovies.java aula, onde eu estava tentandoget() a lista de filmes para os cinemas correspondentes.

public class LoadingMovies
        extends AppCompatActivity {
    private static final String TAG = "RecyclerViewExample";
    private List<ItemObjects> feedsList;
    private RecyclerView mRecyclerView;
    private LoadingMoviesAdapter adapter;
    private ProgressBar progressBar;
    private String moviename = "MovieName";
    private String moviepic = "photo";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ntinda);
        //
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Now Showing Ntinda ");
        Bundle bundle = getIntent().getExtras();
        Bundle extras = getIntent().getExtras();
        String imageString = extras.getString(NtindaCinemaViewHolders.KEY_MOVIE_IMAGE);
        // Initialize recycler view
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view1);
      /*  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));*/
        GridLayoutManager manager = new GridLayoutManager(this, 3);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return (3 - position % 4);
            }
        });
        mRecyclerView.setLayoutManager(manager);
        progressBar = (ProgressBar) findViewById(R.id.progress_bar1);
        progressBar.setVisibility(View.VISIBLE);
        // Downloading data from below url
        // internet connectivity........
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        final String url = "http://10.0.2.2/UgandaEntertainment/Cinema/fetch.php";
        if(netInfo != null && netInfo.isConnectedOrConnecting()) {
            new AsyncHttpTask().execute(url);
        } else {
            Toast.makeText(this, "No network connection! , please check your connectivity", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public class AsyncHttpTask
            extends AsyncTask<String, Void, Integer> {
        @Override
        protected void onPreExecute() {
            setProgressBarIndeterminateVisibility(true);
        }

        @Override
        protected Integer doInBackground(String... params) {
            Integer result = 0;
            HttpURLConnection urlConnection;
            try {
                URL url = new URL(params[0]);
                urlConnection = (HttpURLConnection) url.openConnection();
                int statusCode = urlConnection.getResponseCode();
                // 200 represents HTTP OK
                if(statusCode == 200) {
                    BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while((line = r.readLine()) != null) {
                        response.append(line);
                    }
                    parseResult(response.toString());
                    result = 1; // Successful
                } else {
                    result = 0; //"Failed to fetch data!";
                }
            } catch(Exception e) {
                Log.d(TAG, e.getLocalizedMessage());
            }
            return result; //"Failed to fetch data!";
        }

        @Override
        protected void onPostExecute(Integer result) {
            // Download complete. Let us update UI
            progressBar.setVisibility(View.GONE);
            if(result == 1) {
                adapter = new LoadingMoviesAdapter(LoadingMovies.this, feedsList);
                mRecyclerView.setAdapter(adapter);
            } else {
                Toast.makeText(LoadingMovies.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void parseResult(String result) {
        try {
            JSONArray ar = new JSONArray(result);
            feedsList = new ArrayList<>();
            for(int i = 0; i < ar.length(); i++) {
                JSONObject obj = ar.getJSONObject(i);
                ItemObjects item = new ItemObjects();
                // declaring bundle
                // what should i put here to access the movies and showTime????
                Bundle bundle = getIntent().getExtras();
                //      moviename = bundle.getString(CinemaViewHolders.KEY_MOVIE_NAME);
                //   moviepic = bundle.getString(CinemaViewHolders.KEY_MOVIE_IMAGE);
                ItemObjects huxy = new ItemObjects();
                JSONArray movieArray = obj.getJSONArray("Movie");
                //get the first object of Movie  JSONArray and use it.
                JSONObject movieObject = movieArray.getJSONObject(0);
                item.setMovieName(movieObject.optString(huxy.getMovieName()));
                //This JSON object to get SHOWTIME object
                JSONObject showTime = movieObject.getJSONObject("ShowTime");
                item.setPhoto(movieObject.optString("photo"));
                feedsList.add(item);
            }
        } catch(JSONException e) {
            e.printStackTrace();
        }
    }
}

Este é o adaptadorLoadingMoviesAdapter.java

public class LoadingMoviesAdapter
        extends RecyclerView.Adapter<NtindaCinemaViewHolders> {
    private String url = "http://10.0.2.2/UgandaEntertainment/Ntinda/NtindaPics/";
    private List<ItemObjects> itemList = null;
    private Context context;
    public View root = null;

    private ArrayList<ItemObjects> arraylist;

    public LoadingMoviesAdapter(Context context, List<ItemObjects> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public NtindaCinemaViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.ntinda_cinema_list, parent, false);
        NtindaCinemaViewHolders rcv = new NtindaCinemaViewHolders(layoutView, context);
        return rcv;
    }

    public static String encodeTobase64(Bitmap image) {
        Bitmap immagex = image;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        immagex.compress(Bitmap.CompressFormat.JPEG, 90, baos);
        byte[] b = baos.toByteArray();
        String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
        // Log.e("LOOK", imageEncoded);
        return imageEncoded;
    }

    @Override
    public void onBindViewHolder(final NtindaCinemaViewHolders holder, final int position) {
        final ItemObjects feedItem = itemList.get(position);
        holder.root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap attachedbitmap = ((BitmapDrawable) holder.moviepic.getDrawable()).getBitmap();
                Intent intent = new Intent(LoadingMoviesAdapter.this.context, MovieScrollingActivity.class);
                intent.putExtra(NtindaCinemaViewHolders.KEY_SYNOPSIS, feedItem.getSynopsis());
                intent.putExtra(NtindaCinemaViewHolders.KEY_MOVIE_IMAGE, encodeTobase64(attachedbitmap));
                context.startActivity(intent);
            }
        });
        //Download image using picasso library
        Picasso.with(context).load(url + feedItem.getPhoto()).error(R.drawable.placeholder).
                resize(500, 500).placeholder(R.drawable.placeholder)
                .into(holder.moviepic);
        holder.moviename.setText(itemList.get(position).getMovieName());
    }

    @Override
    public int getItemCount() {
        return (null != itemList ? itemList.size() : 0);
    }
}

Eu acho que tenho que ajustar oLoadingMovies classe, especialmente noparseResult () Método. Alguma sugestão?

questionAnswers(0)

yourAnswerToTheQuestion