![](/img/trans.png)
[英]Encountered the error Attempt to invoke virtual method 'RecyclerView.setAdapter(RecyclerView$Adapter)' on a null object reference in Android Studio
[英]Recyclerview in Android Studio Error - "null object reference"
我是 android 的新人,我剛剛搞砸了。 我使用了 recycleView 模板,它工作正常,但我想將我的 object 的類型從字符串更改為“TagsManagerObject”,其中包含
private String tagName;
private String gender;
private String mAgeMin;
private String mAgeMax;
private String mDistance;
從那時起我就陷入了這個錯誤:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tinderapp, PID: 10921
java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.tinderapp.Tags.TagsManagerAdapter$ItemClickListener.onDeleteClick(int)' on a null object reference
at com.example.tinderapp.Tags.TagsManagerAdapter$ViewHolder$1.onClick(TagsManagerAdapter.java:78)
at android.view.View.performClick(View.java:6614)
at android.view.View.performClickInternal(View.java:6587)
at android.view.View.access$3100(View.java:787)
at android.view.View$PerformClick.run(View.java:26122)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6831)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:927)
我的適配器看起來像:
public class TagsManagerAdapter extends RecyclerView.Adapter<TagsManagerAdapter.ViewHolder>{
private LayoutInflater mInflater;
private ImageView mDeleteImage;
private List<TagsManagerObject> mTagsManagerObject;
private ItemClickListener mItemClickListener;
// data is passed into the constructor
public TagsManagerAdapter(Context context,List<TagsManagerObject> TagsManagerObject) {
this.mInflater = LayoutInflater.from(context);
this.mTagsManagerObject = TagsManagerObject;
}
// inflates the row layout from xml when needed
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_tags_manager, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
// String tag = TagsManagerObject.get(position);
holder.tagName.setText("#"+mTagsManagerObject.get(position).getTagName());
holder.gender.setText(mTagsManagerObject.get(position).getGender());
holder.distance.setText(mTagsManagerObject.get(position).getmDistance());
holder.tagAge.setText(mTagsManagerObject.get(position).getmAgeMin() + "-" + mTagsManagerObject.get(position).getmAgeMax());
}
// binds the data to the TextView in each row
// total number of rows
@Override
public int getItemCount() {
return mTagsManagerObject.size();
}
public void setClickListener(ItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView tagName,gender,tagAge,distance;
ViewHolder(View itemView) {
super(itemView);
tagName= itemView.findViewById(R.id.tag);
gender = itemView.findViewById(R.id.tag_gender);
distance = itemView.findViewById(R.id.tag_distance);
tagAge = itemView.findViewById(R.id.tag_age);
mDeleteImage = itemView.findViewById(R.id.tag_delete);
itemView.setOnClickListener(this);
mDeleteImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if(position!=RecyclerView.NO_POSITION){
mItemClickListener.onDeleteClick(position); <<--- HERE IS THE ERROR
}
}
});
}
@Override
public void onClick(View view) {
if (mItemClickListener != null) mItemClickListener.onItemClick(view, getAdapterPosition());
}
}
// convenience method for getting data at click position
String getItem(int id) {
return mTagsManagerObject.get(id).toString();
}
// allows clicks events to be caught
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
void onDeleteClick(int position);
}
}
所以當我點擊刪除按鈕時它崩潰了。 有誰知道為什么? 謝謝。
當您在 object 即 null 上調用onDeleteClick(position)
時出現此異常,因此您必須在調用此方法onDeleteClick(position)
之前為mItemClickListener
設置一個值
在您的代碼中,您必須在使用此適配器的活動/片段中調用適配器的setClickListener()
。
你需要做兩件事。
首先,您需要檢查 mItemClickListener 是否為 null。這樣做可以防止 null 指針異常。
mDeleteImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if(position!=RecyclerView.NO_POSITION){
if(mItemClickListener !=null){
mItemClickListener.onDeleteClick(position); <<--- HERE IS THE ERROR
}
}
}
}
);
第二件事是您應該使用 RecyclerviewAdapter 的實例設置/調用 Activity/Fragment 的setClickListener 。
這樣做將使 Activity/Fragment 實現您的ItemClickListener和onDeleteClick()方法。
adapter.setClickListener(this);
或者,您也可以在這里使用匿名class。
謝謝大家的幫助。 問題是在我的活動中我有:
1.創建了帶有空標簽列表的適配器
2.設置onclicklistener
adapter.setOnItemClickListener(new TagsManagerAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
}
@Override
public void onDeleteClick(int position) {
System.out.println("works?");
removeItem(position);
}
});
反而
adapter.notifyDataSetChanged();
我用過:
adapter = new TagsManagerAdapter(myTagsList);
這引起了問題,它找不到我的聽眾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.