Android空指针异常:调用MovieItemClickListener接口方法时对象为空
MovieItemClickListener in MovieAdapter Hey there, let's sort out this null pointer exception you're running into! The error message:
Attempt to invoke interface method 'void com.example.imovie.adapter.MovieItemClickListener.onMovieClick(com.example.imovie.models.Movie, android.widget.ImageView)' on a null object reference
...is happening because the movieItemClickListener you're passing to your MovieAdapter from HomeFragment is null. You declared the listener variable in HomeFragment but never assigned it a valid instance before passing it to the adapter.
Why This Happens
When you set up the click listener in your MovieAdapter's MyViewHolder, you're trying to call a method on a listener that doesn't exist yet. The HomeFragment holds a reference to this listener but didn't initialize it—so when the adapter tries to use it, it hits that null pointer.
Step-by-Step Fix
Here's how to get this working properly:
1. Make HomeFragment implement the MovieItemClickListener interface
This lets the fragment act as the listener for your adapter's click events.
2. Pass the initialized listener to MovieAdapter
When creating your adapter instance in the fragment, pass this (since the fragment now implements the interface) instead of a null variable.
3. Add a safety check (optional but recommended)
Add a non-null check before calling the listener method in the adapter to prevent crashes if something goes wrong later.
Updated HomeFragment Code
public class HomeFragment extends Fragment implements MovieItemClickListener { private RecyclerView recyclerView; private MovieAdapter movieAdapter; // Add other necessary variables here @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); // Initialize RecyclerView recyclerView = view.findViewById(R.id.movie_recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // Create adapter with the fragment as the listener movieAdapter = new MovieAdapter(getContext(), this); recyclerView.setAdapter(movieAdapter); // Load your movie data here and set it to the adapter // movieAdapter.setMovieList(yourMovieList); return view; } // Implement the required interface method @Override public void onMovieClick(Movie movie, ImageView imageView) { // Add your click logic here—like opening a detail activity Intent detailIntent = new Intent(getContext(), MovieDetailActivity.class); detailIntent.putExtra("SELECTED_MOVIE", movie); // Handle shared element transitions if needed startActivity(detailIntent); } }
Updated MovieAdapter Code
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MyViewHolder> { private Context context; private List<Movie> movieList; private MovieItemClickListener movieItemClickListener; // Constructor that accepts context and the listener public MovieAdapter(Context context, MovieItemClickListener listener) { this.context = context; this.movieItemClickListener = listener; this.movieList = new ArrayList<>(); } // Method to set movie data (if needed) public void setMovieList(List<Movie> movieList) { this.movieList = movieList; notifyDataSetChanged(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context) .inflate(R.layout.movie_item_layout, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Movie movie = movieList.get(position); // Bind movie data to views here—like loading the poster // Glide.with(context).load(movie.getPosterUrl()).into(holder.moviePoster); } @Override public int getItemCount() { return movieList.size(); } public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { ImageView moviePoster; // Add other view references here public MyViewHolder(View itemView) { super(itemView); moviePoster = itemView.findViewById(R.id.movie_poster); // Set click listener on the item view itemView.setOnClickListener(this); } @Override public void onClick(View v) { Movie clickedMovie = movieList.get(getAdapterPosition()); // Safety check to avoid null pointers if (movieItemClickListener != null) { movieItemClickListener.onMovieClick(clickedMovie, moviePoster); } } } }
Quick Tip
That non-null check in the adapter's onClick method is a good practice—it adds a safety net in case you accidentally pass a null listener later. It won't fix the root issue, but it'll prevent crashes while you debug.
内容的提问来源于stack exchange,提问作者tommy

