RecyclerView Elemento para cargar otro RecyclerView con JSON anidado

Estoy desarrollando una aplicación que muestra elLista de cines y también elLista de películas que se muestran en cada cine. Quiero usar 2 RecyclerViews,Uno primero enumera los nombres de cine, y elSegundo Uno viene después de hacer clic en elPelículas elemento del primer RecyclerView.

Uso unJSON anidado para recuperar la información, y he recuperado con éxito la lista de cines, pero no recibo películas coincidentes en el Second RecyclerView.

ClasesCinema yCinemaAdapter son responsables de recuperar CinemaNames y Películas mediante el uso deJSONArray, pero quiero que las películas se muestren en Second RecyclerView (LoadingMovies.java clase yLoadingMoviesAdapter.java La clase es responsable del segundo RecyclerView). ClasesLoadingMovies.java yLoadingMovies.java son responsables de obtener datos de CinemaAdapter después de hacer clic paraMostrar la lista de películas. (En general, quiero que cada cine vuelva a cargar sus películas de acuerdo con el JSON) Actualmente obtengo las dos películas aame en todos los cines, dejando el resto sin mostrar.

A continuación se muestra mi JSON anidado:

 [
  {
    "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 es miCinema.java clase

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 es miCinemaAdapter.java Clase. En elonBindViewHolder() método, trato de enviar elMovieName,MovieImage,... para enviarlos a la segunda RecyclerView que está en manos delLoadingMovies.java clase para volver a cargar una lista de películas en 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);
    }
}

Este es elLoadingMovies.java clase, donde estaba tratando deget() la lista de películas a los cines correspondientes.

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 es el 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);
    }
}

Creo que tengo que ajustar elCargandoPelículas clase, especialmente en elparseResult () Método. ¿Alguna sugerencia?

Respuestas a la pregunta(0)

Su respuesta a la pregunta