You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android空指针异常:调用MovieItemClickListener接口方法时对象为空

Fixing Null Pointer on 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.

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:32