>
NowShowingFragment.java
package com.example.bookit.Fragments;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.bookit.Activities.ApiConfig;
import com.example.bookit.Activities.MovieDetailActivity;
import com.example.bookit.Adapters.NowShowingAdapter;
import com.example.bookit.Models.Movie;
import com.example.bookit.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class NowShowingFragment extends Fragment {
private SwipeRefreshLayout swipeRefreshLayout;
private LinearLayout errorContainer;
private ImageView ivError;
private TextView tvError;
private Button btnRetry;
private ProgressBar progressBar;
private RecyclerView rvNowShowing;
private ArrayList<Movie> nowShowingMovieList;
private NowShowingAdapter nowShowingAdapter;
private Context mContext;
public NowShowingFragment() {
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.now_showing_fragment, container, false);
}
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getContext();
swipeRefreshLayout = view.findViewById(R.id.swipeLayout);
errorContainer = view.findViewById(R.id.errorContainer);
ivError = view.findViewById(R.id.ivError);
tvError = view.findViewById(R.id.tvError);
btnRetry = view.findViewById(R.id.btnRetry);
progressBar = view.findViewById(R.id.progressBar);
rvNowShowing = view.findViewById(R.id.rvNowShowing);
swipeRefreshLayout.setOnRefreshListener(new
SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
fetchNowShowingDataFromServer();
}
});
btnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fetchNowShowingDataFromServer();
}
});
fetchNowShowingDataFromServer();
}
private void fetchNowShowingDataFromServer() {
if(!isNetworkConnected()){
progressBar.setVisibility(View.GONE);
errorContainer.setVisibility(View.VISIBLE);
return;
}
progressBar.setVisibility(View.VISIBLE);
errorContainer.setVisibility(View.GONE);
StringRequest Request = new StringRequest(ApiConfig.GET_MOVIE_DETAILS_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressBar.setVisibility(View.GONE);
swipeRefreshLayout.setRefreshing(false);
errorContainer.setVisibility(View.GONE);
Log.i("mytag", response);
try {
JSONObject jsonResponse = new JSONObject(response);
JSONArray movieArray = jsonResponse.getJSONArray("movie");
Gson gson = new Gson();
Type movielistType = new TypeToken<ArrayList<Movie>>(){}.getType();
nowShowingMovieList = gson.fromJson(movieArray.toString(),movielistType);
nowShowingAdapter = new NowShowingAdapter(nowShowingMovieList, new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(mContext, MovieDetailActivity.class);
intent.putExtra("movie",nowShowingMovieList.get(position));
startActivity(intent);
}
});
rvNowShowing.setLayoutManager(new LinearLayoutManager(mContext, RecyclerView.VERTICAL, false));
rvNowShowing.setAdapter(nowShowingAdapter);
} catch (JSONException e) {
errorContainer.setVisibility(View.VISIBLE);
e.printStackTrace();
Toast.makeText(mContext, "Unable to process Server Response", Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressBar.setVisibility(View.GONE);
swipeRefreshLayout.setRefreshing(false);
errorContainer.setVisibility(View.VISIBLE);
error.printStackTrace();
Toast.makeText(mContext, "Unable to fetch Data from Server", Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(mContext.getApplicationContext()).add(Request);
}
private boolean isNetworkConnected(){
ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
return true;
}else {
return false;
}
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
}
它导致了细节activity(MovieDetailActivity.java)
package com.example.bookit.Activities;
import android.net.Uri;
import android.os.Bundle;
import com.example.bookit.Adapters.MovieDetailPagerAdapter;
import com.example.bookit.Fragments.NowShowingFragment;
import com.example.bookit.Models.Movie;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
import android.view.View;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.VideoView;
import com.example.bookit.R;
import com.google.android.material.tabs.TabLayout;
import com.squareup.picasso.Picasso;
public class MovieDetailActivity extends AppCompatActivity {
private Movie selectedMovie ;
private VideoView movieTrailer;
private ImageView ivmovieImage;
private TextView tvMovieName;
private TextView tvMovieReleaseDate;
private RatingBar ratingBar;
private TextView tvMovieRating;
private CardView cvBookTicket;
private TabLayout tabMovieDetail;
private ViewPager detailViewPager;
private MovieDetailPagerAdapter movieDetailPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movie_detail);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
movieTrailer = findViewById(R.id.movieTrailer);
ivmovieImage = findViewById(R.id.ivMovieImage);
tvMovieName = findViewById(R.id.tvMovieName);
tvMovieRating = findViewById(R.id.tvMovieRating);
tvMovieReleaseDate = findViewById(R.id.tvMovieReleaseDate);
ratingBar = findViewById(R.id.ratingBar);
cvBookTicket = findViewById(R.id.cvBookTicket);
tabMovieDetail = findViewById(R.id.tabMovieDetail);
detailViewPager = findViewById(R.id.detailViewPager);
// movieDetailPagerAdapter = new MovieDetailPagerAdapter(getSupportFragmentManager());
FragmentManager fm = getSupportFragmentManager();
movieDetailPagerAdapter = new MovieDetailPagerAdapter(fm);
detailViewPager.setAdapter(movieDetailPagerAdapter);
tabMovieDetail.setupWithViewPager(detailViewPager);
selectedMovie = (Movie) getIntent().getSerializableExtra("movie");
int movieId = selectedMovie.getMovieId();
Picasso.get().load(selectedMovie.getMovieImage()).placeholder(R.drawable.image_placeholder).into(ivmovieImage);
tvMovieName.setText(selectedMovie.getMovieName());
tvMovieReleaseDate.setText(String.valueOf(selectedMovie.getMovieReleaseDate()));
tvMovieRating.setText(String.valueOf(selectedMovie.getMovieRating()));
ratingBar.setRating((float) selectedMovie.getMovieRating());
//holder.ratingBar.setRating((float) dataset.get(position).getMovieRating());
//ratingBar.setProgress(Integer.parseInt(String.valueOf(selectedMovie.getMovieRating())));
// String URL = selectedMovie.getMovieTrailerUrl();
// movieTrailer.setVideoURL(Uri.parse(URL));
// movieTrailer.start();
movieTrailer.setVideoURI(Uri.parse(selectedMovie.getMovieTrailerUrl()));
movieTrailer.start();
cvBookTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
sendInfoData();
}
private void sendInfoData() {
Bundle bundle = new Bundle();
bundle.putString("language", selectedMovie.getMovieLanguage());
bundle.putString("duration", selectedMovie.getMovieDuration());
bundle.putString("director", selectedMovie.getMovieDirector());
bundle.putString("genre", selectedMovie.getMovieGenre());
bundle.putString("description", selectedMovie.getMovieDescription());
bundle.putSerializable("selected", selectedMovie);
// set MyFragment Arguments
NowShowingFragment movieObject = new NowShowingFragment();
movieObject.setArguments(bundle);
}
}
它包含3个片段,它们是:i)MovieInformationFragment.java
package com.example.bookit.Fragments;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.example.bookit.Activities.MovieDetailActivity;
import com.example.bookit.Models.Movie;
import com.example.bookit.R;
import javax.crypto.interfaces.PBEKey;
/**
* A simple {@link Fragment} subclass.
*/
public class MovieInfromationFragment extends Fragment {
private TextView tvMovieLanguage;
private TextView tvMovieGenre;
private TextView tvMovieDuration;
private TextView tvMovieDirector;
public MovieInfromationFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_movie_infromation, container, false);
}
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvMovieLanguage = view.findViewById(R.id.tvMovieLanguage);
tvMovieGenre = view.findViewById(R.id.tvMovieGenre);
tvMovieDirector = view.findViewById(R.id.tvMovieDirector);
tvMovieDuration = view.findViewById(R.id.tvMovieDuration);
tvMovieLanguage.setText(this.getArguments().getString("language"));
tvMovieGenre.setText(this.getArguments().getString("genre"));
tvMovieDirector.setText(this.getArguments().getString("director"));
tvMovieDuration.setText(this.getArguments().getString("duration"));
}
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
}
ii)MovieDescriptionFragment.java它包含电影的故事情节。
package com.example.bookit.Fragments;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.bookit.Models.Movie;
import com.example.bookit.R;
/**
* A simple {@link Fragment} subclass.
*/
public class MovieDescriptionFragment extends Fragment {
private TextView tvMovieDescription;
public MovieDescriptionFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_movie_description, container, false);
}
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvMovieDescription = view.findViewById(R.id.tvMovieDescription);
tvMovieDescription.setText(this.getArguments().getString("description"));
}
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
}
iii)moviecastfragment.java它包含所选电影的演员图像和名称。
package com.example.bookit.Fragments;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.bookit.Activities.ApiConfig;
import com.example.bookit.Activities.MovieDetailActivity;
import com.example.bookit.Adapters.MovieCastAdapter;
import com.example.bookit.Adapters.NowShowingAdapter;
import com.example.bookit.Models.Actor;
import com.example.bookit.Models.Cast;
import com.example.bookit.Models.Movie;
import com.example.bookit.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.ArrayList;
/**
* A simple {@link Fragment} subclass.
*/
public class MovieCastFragment extends Fragment {
private ProgressBar progressBar;
private RecyclerView rvMoviecast;
private ArrayList<Actor> movieActorList;
private MovieCastAdapter movieCastAdapter;
private Context mContext;
public MovieCastFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_movie_cast, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getContext();
progressBar = view.findViewById(R.id.progressBar);
rvMoviecast = view.findViewById(R.id.rvMoviecast);
Serializable castArray = getArguments().getSerializable("selectedMovie");
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
}
MovieCast片段由MovieCastAdapter组成,因为我在其中使用了回收器视图。
package com.example.bookit.Adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.bookit.Models.Actor;
import com.example.bookit.R;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class MovieCastAdapter extends RecyclerView.Adapter<MovieCastAdapter.movieCastHolder>{
private ArrayList<Actor> dataset;
private AdapterView.OnItemClickListener onItemClickListener;
public MovieCastAdapter() {
}
public MovieCastAdapter(ArrayList<Actor> dataset, AdapterView.OnItemClickListener onItemClickListener) {
this.dataset = dataset;
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public movieCastHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie_cast, parent, false);
return new movieCastHolder(v);
}
@Override
public void onBindViewHolder(@NonNull movieCastHolder holder, int position) {
Context context = holder.itemView.getContext();
Picasso.get().load(dataset.get(position).getActorImage()).placeholder(R.drawable.image_placeholder).into(holder.ivActorImage);
holder.tvActorName.setText(dataset.get(position).getActorName());
}
@Override
public int getItemCount() {
return dataset.size();
}
public class movieCastHolder extends RecyclerView.ViewHolder{
private ImageView ivActorImage;
private TextView tvActorName;
public movieCastHolder(@NonNull View itemView) {
super(itemView);
ivActorImage = itemView.findViewById(R.id.ivActorImage);
tvActorName = itemView.findViewById(R.id.tvMovieName);
}
}
}
所有这些片段都由MovieDetailPagerAdapter.java管理,我将其代码发布如下:
package com.example.bookit.Adapters;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import com.example.bookit.Fragments.MovieCastFragment;
import com.example.bookit.Fragments.MovieDescriptionFragment;
import com.example.bookit.Fragments.MovieInfromationFragment;
public class MovieDetailPagerAdapter extends FragmentPagerAdapter {
public MovieDetailPagerAdapter(FragmentManager fm) {
super(fm);
}
public CharSequence getPageTitle(int position) {
if (position==0){
return "Information";
}
if (position==1){
return "Cast";
}
if (position==2){
return "Description";
}
return super.getPageTitle(position);
}
@Override
public Fragment getItem(int position) {
if (position==0){
return new MovieInfromationFragment();
}else if(position==1){
return new MovieCastFragment();
}else if(position==2){
return new MovieDescriptionFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
您只需使用Rovfit获取数据并将其存储在MoviesData列表中,并在DetailActivity中显示特定电影的细节,将该电影对象作为额外对象传递给该activity。 就像这样:
Intent intent = new Intent(this, ItemDetailActivity.class);
intent.putExtra("selectedMovie", selectedMovie);
startActivity(intent);
在这里,selectedMovie是要在DetailActivity中显示的电影对象。
然后把电影细节分享给片断,试着这样做:
Bundle arguments = new Bundle();
arguments.putParcelable("selectedMovie", selectedMovie);
MovieDetailFragment fragment = new MovieDetailFragment();
fragment.setArguments(arguments);
this.getSupportFragmentManager().beginTransaction()
.replace(R.id.movie_detail_container, fragment)
.commit();
希望它对你有用!
由于您没有提供代码,假设您是从网络获取json,我将不使用代码回答
1-您必须使用asynctask或Rovfit或类似的方法异步获取json列表
2-创建一个movie对象,并使用gson之类的东西将json转换为该对象
3-使用intent或更好的ViewModel之类的东西在视图之间共享数据
ViewModel的文档很容易理解,并且包含了您所需要的示例
4-可选地将数据存储在sqlite中以供脱机使用