我正在为电影应用程序使用 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/