提问者:小点点

如何将所选电影的数据提取到detailActivity,然后再提取到细节activity中的片段?


>

  • 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;
                }
            }
    

  • 共2个答案

    匿名用户

    您只需使用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中以供脱机使用