我正在开发一个应用程序,显示电影院列表以及每个电影中的显示电影列表。 我想使用2个RecyclerViews,一个首先列出电影院名称,第二个一个来自 点击第一个RecyclerView的电影项目。
我使用嵌套JSON 来检索信息,并且我已经成功检索了电影院列表,但我在第二台RecyclerView中没有收到匹配的电影。
类Cinema
和CinemaAdapter
负责使用 JSONArray 检索CinemaNames和电影,但
我希望电影能够显示在Second RecyclerView(LoadingMovies.java
类和LoadingMoviesAdapter.java
类中
负责第二次RecyclerView)。
在点击之后,类LoadingMovies.java
和LoadingMovies.java
负责从CinemaAdapter获取数据
显示电影列表。
(通常我希望每个影院根据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 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"
}
}
]
}
]
这是我的Cinema.java
班级
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();
}
}
}
这是我的CinemaAdapter.java
班级。在onBindViewHolder()
方法中,我尝试发送MovieName,MovieImage,...
将它们发送到第二个RecyclerView,它由LoadingMovies.java
类保存,以重新加载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);
}
}
这是LoadingMovies.java
课程,我试图get()
电影列表到相应的电影院。
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();
}
}
}
此适配器LoadingMoviesAdapter.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);
}
}
我想我必须调整 LoadingMovies 类,特别是在 parseResult()方法中。有什么建议吗?