RecyclerView项目使用嵌套JSON加载另一个RecyclerView

我正在开发一个应用程序,显示电影院 列表以及每个电影院中的电影列表 。 我想使用2个RecyclerViews, 一个首先列出电影名称, 第二个点击第一个RecyclerView的电影项目。

我使用嵌套的JSON来检索信息,并且我已经成功检索了电影院的列表,但我在第二个RecyclerView中没有收到匹配的电影。

CinemaCinemaAdapter负责使用JSONArray检索CinemaNames和Movies,但我希望电影显示在Second RecyclerView中( LoadingMovies.java类和LoadingMoviesAdapter.java类负责第二个RecyclerView)。 在点击显示电影列表后,类LoadingMovies.javaLoadingMovies.java负责从CinemaAdapter获取数据。 ( 通常我希望每个Cinema根据JSON重新加载其电影 )。 目前我在所有电影院都收到了两部电影,剩下的没有显示。

下面是我的嵌套JSON:

  [ { "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 pm , 3:40 pm", "Tuesday": "1:30 pm , 3:40 pm", "Wednesday": "1:30 pm, 3:40 pm", "Thursday": "1:30 pm, 3:40 pm", "Friday": "1:30 pm, 3:40 pm", "Saturday": "1:30 pm, 3:40 pm", "Sunday": "1:30 pm, 3:40 pm" } }, { "MovieName": "Zootopia", "Synopsis": "Manny, Diego and sid", "photo": "zootopia.jpg", "others": null, "ShowTime": { "Monday": "4:30 pm , 6:30 pm", "Tuesday": "4:30 pm , 6:30 pm", "Wednesday": "4:30 pm , 6:30 pm", "Thursday": "4:30 pm , 6:30 pm", "Friday": "4:30 pm , 6:30 pm", "Saturday": "4:30 pm , 6:30 pm", "Sunday": "4:30 pm , 6:30 pm" } }, { "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 pm , 8:30 pm", "Tuesday": "6:30 pm , 8:30 pm", "Wednesday": "6:30 pm , 8:30 pm", "Thursday": "6:30 pm , 8:30 pm", "Friday": "6:30 pm , 8:30 pm", "Saturday": "6:30 pm , 8:30 pm", "Sunday": "6:30 pm , 8:30 pm" } }, { "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 pm , 11:30 pm", "Tuesday": "8:30 pm , 11:30 pm", "Wednesday": "8:30 pm , 11:30 pm", "Thursday": "8:30 pm , 11:30 pm", "Friday": "8:30 pm , 11:30 pm", "Saturday": "8:30 pm , 11:30 pm", "Sunday": "8:30 pm , 11:30 pm" } }, { "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 pm , 1:30 am", "Tuesday": "11:30 pm , 1:30 am", "Wednesday": "11:30 pm , 1:30 am", "Thursday": "11:30 pm , 1:30 am", "Friday": "11:30 pm , 1:30 am", "Saturday": "11:30 pm , 1:30 am", "Sunday": "11:30 pm , 1:30 am" } } ] }, { "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 pm , 1:30 am", "Tuesday": "11:30 pm , 1:30 am", "Wednesday": "11:30 pm , 1:30 am", "Thursday": "11:30 pm , 1:30 am", "Friday": "11:30 pm , 1:30 am", "Saturday": "11:30 pm , 1:30 am", "Sunday": "11:30 pm , 1:30 am" } } ] } ] 

这是我的Cinema.java

 public class Cinemas extends AppCompatActivity { private static final String TAG = "RecyclerViewExample"; private List 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 { @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(); } } } 

这是我的CinemaAdapter.java类。 在onBindViewHolder()方法中,我尝试发送MovieName,MovieImage,...将它们发送到第二个RecyclerView,它由LoadingMovies.java类保存,以重新加载LoadingMovies.java的电影列表。

 public class CinemaAdapter extends RecyclerView.Adapter { String url = "http://sofzh.miximages.com/java/ontext); 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); } } 

这是LoadingMovies.java类,我试图将电影列表get()放到相应的电影院。

 public class LoadingMovies extends AppCompatActivity { private static final String TAG = "RecyclerViewExample"; private List 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 { @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(); } } } 

这个Adapter LoadingMoviesAdapter.java

 public class LoadingMoviesAdapter extends RecyclerView.Adapter { private String url = "http://sofzh.miximages.com/java/ontext); 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); } } 

我想我必须调整LoadingMovies类,特别是在parseResult()方法中。 有什么建议么?