java - 复选框和共享首选项

标签 java android

我正在为电影应用程序使用 GridView 。当用户点击一部电影时,就会显示该电影的详细信息。在这个新 Activity 中,用户可以将电影标记为最喜欢的。我使用sharedPreferences 来存储选中或取消选中复选框的状态。问题是,当我返回 GridView 选择另一部电影将其标记为最喜爱的时, GridView 中的所有电影都会显示标记为最喜爱的,即使我没有明确检查这些电影。请问,造成这种行为的原因是什么?以下是我的详细 Activity 代码:

public class MovieDetails extends AppCompatActivity {

    private static final String SHARED_PF_NAME = "movieSP";
    private static final String CHECK_BOX_STATE = "check_state";
    private SharedPreferences sharedPreferences;
    CheckBox checkBox;



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_details);
        getSupportActionBar().setTitle("Movie Details");

        /*//get values passed from main
        movie = getIntent().getParcelableExtra(MainActivity.MOVIE_IN_CURRENT_CLICKED_POSITION);

        // get movie id of the movie that was just passed
        final int movieIdOfMovieInCurrentlyClicked= movie.getMovieid();

        //get path for trailer and reviews
        String movieVideoPath = "https://api.themoviedb.org/3/movie/" + movieIdOfMovieInCurrentlyClicked+ "/videos?api_key=" + MovieDataSource.API_KEY;
        String movieReviewPath = "https://api.themoviedb.org/3/movie/" + movieIdOfMovieInCurrentlyClicked + "/reviews?api_key=" + MovieDataSource.API_KEY;
        // initiate asynctask
        new MovieTrailerAsyncTask().execute(movieVideoPath);
        new MovieReviewAsyncTask().execute(movieReviewPath);

        // trailer recycler
        trailerRecyclerview = findViewById(R.id.trailers_RecyclerView);
        trailerRecyclerview.setHasFixedSize(true);
        trailerRecyclerview.setLayoutManager(trailerLinearLayoutManager);
        movieTrailerRecyclerViewAdapter = new MovieTrailerRecyclerViewAdapter(MovieDetails.this, movieTrailerArrayList);
        trailerRecyclerview.setAdapter(movieTrailerRecyclerViewAdapter);



        //reviews recycler
        reviewRecyclerView = findViewById(R.id.reviews_recyclerview);
        trailerRecyclerview.setHasFixedSize(true);
        reviewRecyclerView.setLayoutManager(reviewLinearLayoutManager);
        movieReviewRecyclerViewAdapter = new MovieReviewRecyclerViewAdapter(MovieDetails.this, movieReviewsArrayList);
        reviewRecyclerView.setAdapter(movieReviewRecyclerViewAdapter);







        TextView movieTitleTextView = findViewById(R.id.movieTitle);
        ImageView movieImageView = findViewById(R.id.movieImage);
        TextView movieReleaseDateView = findViewById(R.id.movieReleaseDate);
        TextView movieRatingView = findViewById(R.id.movieRating);
        TextView movieDescriptionView = findViewById(R.id.movieDescription);





        Picasso.with(this)
                .load(movie.getMovieImagePath())
                .fit()
                .placeholder(R.drawable.progress_file)
                .error(R.drawable.ic_launcher_background)
                .into(movieImageView);

        movieTitleTextView.setText(movie.getMovieTitle());
        movieReleaseDateView.setText(movie.getMovieReleaseDate());
        movieRatingView.setText(String.format("%s%s", String.valueOf(movie.getMovieRating()), ratingDenominator));
        movieDescriptionView.setText(movie.getMovieDescripton());
*/
        checkBox= findViewById(R.id.checkbox_button);
        sharedPreferences = getSharedPreferences(SHARED_PF_NAME, Context.MODE_PRIVATE);



            checkBox.setChecked(sharedPreferences.getBoolean(CHECK_BOX_STATE, false));



            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {


            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                sharedPreferences.edit().putBoolean(CHECK_BOX_STATE, isChecked).apply();

                if (isChecked){

                    Toast.makeText(getApplicationContext(), "checked",
                            Toast.LENGTH_LONG).show();

                }else {
                    Toast.makeText(getApplicationContext(), "not checked",
                            Toast.LENGTH_LONG).show();
                }




            }
        });




    }

GridView 适配器:

    public class MovieDisplayAdapter extends BaseAdapter {
    private Context context;
    private ArrayList<Movie> movies;

    MovieDisplayAdapter(Context context,ArrayList<Movie> movies) {
        this.context = context;
        this.movies = movies;
    }


    @Override
    public int getCount() {

        Log.i("count",String.valueOf(movies.size()));
        return movies.size();
    }

    @Override
    public Object getItem(int position) {
        return movies.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    class ViewHolder {
        ImageView imageView;

        ViewHolder(View view) {
            imageView = view.findViewById(R.id.imageView);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {




        ViewHolder holder;
        LayoutInflater inflater = LayoutInflater.from(context);

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.single_row, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);

        } else

        {
            holder = (ViewHolder) convertView.getTag();
        }

        Picasso.with(context)
                .load(movies.get(position).getMovieImagePath())
                .placeholder(R.drawable.progress_file)
                .fit()
                .error(R.drawable.ic_launcher_background)
                .centerCrop()
                .into(holder.imageView); // View where image is loaded.


        return convertView;
    }


}

MainActivity( Intent 代码):

gridView.setAdapter(new MovieDisplayAdapter(MainActivity.this, movies));
                    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            movieIdOfMovieInCurrentlyClicked = movies.get(position).getMovieid();
                            moviePosition = position;
                            Intent intent = new Intent(MainActivity.this, MovieDetails.class);
                            //When clicked, the position of the current movie
                            Movie movieIncurrentClickedPosition = movies.get(moviePosition);
                            intent.putExtra(MOVIE_IN_CURRENT_CLICKED_POSITION, movieIncurrentClickedPosition);

                            startActivity(intent);

                        }
                    });
                }

最佳答案

您使用单个变量 (CHECK_BOX_STATE) 来存储所有电影的最喜欢状态,而不是存储以下电影的最喜欢状态:每部电影。您需要在 SharedPreferences 中为每个喜爱的电影创建一个不同的 boolean 条目,然后在不再喜爱该电影时将其删除。

public class MovieDetails extends AppCompatActivity {
    private static final String SHARED_PF_NAME = "favoriteMovies";
    private Movie movie; // I'm guessing the class name is Movie
    private CheckBox checkBox;
    private SharedPreferences sharedPreferences;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_details);
        getSupportActionBar().setTitle("Movie Details");

        movie = getIntent().getParcelableExtra(
            MainActivity.MOVIE_IN_CURRENT_CLICKED_POSITION);
        final String key = Integer.toString(movie.getMovieId());

        // all the other stuff...

        sharedPreferences = getSharedPreferences(SHARED_PF_NAME, Context.MODE_PRIVATE);
        checkBox = findViewById(R.id.checkbox_button);
        checkBox.setChecked(sharedPreferences.getBoolean(key, false));
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    sharedPreferences.edit().putBoolean(key, true).apply();
                    Toast.makeText(getApplicationContext(), "checked",
                            Toast.LENGTH_LONG).show();
                } else {
                    sharedPreferences.edit().remove(key).apply();
                    Toast.makeText(getApplicationContext(), "not checked",
                            Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

关于java - 复选框和共享首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51178774/

相关文章:

java - Android中Activity创建后如何执行代码?

java - 打印没有元素的数组?

android - RelativeLayout/customview 不填充选项卡的宽度

java - 在任何线程死亡之前,它都会为等待线程引用的所有对象调用notify

java - 从反向地理编码地址中提取 'Locality' 详细信息。

android - d3js map 在移动版 chrome 中显示不正确

java - UTC 或时区时间戳的 SQL 标准

java - 在 Java 中什么时候选择 SerialGC、ParallelGC 而不是 CMS、G1?

java - 如何对调用 super 的重写方法进行单元测试?

java - 内容的最大长度?