簡體   English   中英

Android Studio 錯誤中的 Recyclerview - “null object 參考”

[英]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 實現您的ItemClickListeneronDeleteClick()方法。

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);
            }
        });
  1. 然后添加項目。

反而

adapter.notifyDataSetChanged();

我用過:

adapter = new TagsManagerAdapter(myTagsList);

這引起了問題,它找不到我的聽眾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM