Java 在回收器项单击侦听器界面中获取空指针异常
我知道这个问题很复杂,但是我被搜索了很多次,我不能理解这个问题。我正在创建一个界面,用于处理“回收器”视图中特定项目的单击侦听器 这是我的课 MovieAdapter.javaJava 在回收器项单击侦听器界面中获取空指针异常,java,android,nullpointerexception,android-recyclerview,Java,Android,Nullpointerexception,Android Recyclerview,我知道这个问题很复杂,但是我被搜索了很多次,我不能理解这个问题。我正在创建一个界面,用于处理“回收器”视图中特定项目的单击侦听器 这是我的课 MovieAdapter.java package com.example.vikas.movie.adapter; /** * Created by vikas on 23/4/17. */ import android.content.Context; import android.support.v7.widget.RecyclerView;
package com.example.vikas.movie.adapter;
/**
* Created by vikas on 23/4/17.
*/
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.example.vikas.movie.R;
import com.example.vikas.movie.helper.CircleTransformation;
import com.example.vikas.movie.model.Movie;
import java.util.List;
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder>
{
private static final String TAG=MovieAdapter.class.getSimpleName();
private List<Movie> movies;
private int rowLayout;
private Context context;
private MovieAdapterListener listener;
public static class MovieViewHolder extends RecyclerView.ViewHolder
{
RelativeLayout moviesLayout;
TextView movieTitle;
TextView data;
TextView movieDescription;
TextView rating;
ImageView imageView;
public MovieViewHolder(View v)
{
super(v);
moviesLayout = (RelativeLayout) v.findViewById(R.id.movie_layout);
movieTitle = (TextView) v.findViewById(R.id.title);
data = (TextView) v.findViewById(R.id.subtitle);
movieDescription = (TextView) v.findViewById(R.id.description);
rating = (TextView) v.findViewById(R.id.rating);
imageView=(ImageView)v.findViewById(R.id.movie_image);
}
}
public MovieAdapter(List<Movie> movies, int rowLayout, Context context)
{
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
}
@Override
public MovieAdapter.MovieViewHolder onCreateViewHolder(ViewGroup parent,
int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
return new MovieViewHolder(view);
}
@Override
public void onBindViewHolder(MovieViewHolder holder, final int position)
{
Movie movie= movies.get(position);
holder.movieTitle.setText(movies.get(position).getTitle());
holder.data.setText(movies.get(position).getReleaseDate());
holder.movieDescription.setText(movies.get(position).getOverview());
holder.rating.setText(movies.get(position).getvote_average().toString());
MovieImage(holder,movie);
applyClickEvents(holder,position);
}
private void applyClickEvents(MovieViewHolder holder,final int position)
{
holder.moviesLayout.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
listener.onItemClicked(position);
}
});
}
private void MovieImage(MovieViewHolder holder,Movie movie)
{
String base_URL="https://image.tmdb.org/t/p/";
String size_Image="w500";
String file_Path=movie.getPosterPath();
StringBuilder image_Path=new StringBuilder();
image_Path.append(base_URL).append(size_Image).append(file_Path);
Log.d(TAG,"movie genere ids "+movie.getGenreIds());
Log.d(TAG,"movie relese date "+movie.getReleaseDate());
if(!TextUtils.isEmpty(image_Path))
{
Glide.with(context).load(image_Path.toString())
.thumbnail(0.5f)
.crossFade()
.transform(new CircleTransformation(context))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.imageView);
}
else
{
holder.imageView.setImageResource(R.drawable.circle);
}
}
public interface MovieAdapterListener
{
void onItemClicked(int position);
}
@Override
public int getItemCount()
{
return movies.size();
}
}
请大家帮忙,我无法理解这个问题。发生这种情况是因为您尚未初始化“侦听器”。在MainActivity中创建新的MovieAdapter并将其分配给“listener”时,必须传递侦听器 在MovieAdapter.java中,将public MovieAdapter()更改为 进入
您可以在接口侦听器中获得
NullPointerException
在适配器类中初始化接口侦听器:
public MovieAdapter(List<Movie> movies, int rowLayout, Context context) {
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
listener = (MovieAdapterListener) context; //add this
}
我认为MovieAdapter应该初始化侦听器成员:
public MovieAdapter(List<Movie> movies, int rowLayout, Context context, MovieAdapterListener lstn)
{
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
this.listener = lstn;
}
在runOnUIThread()中调用setAdapter()。您尚未在适配器中传递任何引用或初始值设定项您的侦听器我现在收到此异常在我所做的更改后您建议java.lang.ClassCastException:android.app.Application无法转换为com.example.vikas.movie.adapter.MovieAdapter$MovieAdapter listener在com.example.vikas.movie.adapter.MovieAdapter.(MovieAdapter.java:66)在com.example.vikas.movie.activity.MainActivity$1.onResponse(MainActivity.java:70)我已经编辑了我的答案…非常感谢你帮我节省了很多时间我们如何创建接口对象
public MovieAdapter(List<Movie> movies, int rowLayout, Context context, MovieAdapterListener listener)
{
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
this.listener=listener;
}
recyclerView.setAdapter(new MovieAdapter(movieList, R.layout.recyclerview_item_movie, getApplicationContext()));
recyclerView.setAdapter(new MovieAdapter(movieList, R.layout.recyclerview_item_movie, getApplicationContext(),listener));
//change "listener into the name of MovieAdapterListener object"
public MovieAdapter(List<Movie> movies, int rowLayout, Context context) {
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
listener = (MovieAdapterListener) context; //add this
}
recyclerView.setAdapter(new MovieAdapter(movieList, R.layout.recyclerview_item_movie, MainActivity.this));
public MovieAdapter(List<Movie> movies, int rowLayout, Context context, MovieAdapterListener lstn)
{
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
this.listener = lstn;
}
recyclerView.setAdapter(new MovieAdapter(movieList, R.layout.recyclerview_item_movie, this, this));