在设置回收器项目中获取NULL指针异常,请单击“侦听器”



我已经搜索了很多,但没有找到任何解决方案。将听众设置为MaiaCtivity

这是我的MainActivity.java文件

package com.example.mynotes;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;

public class MainActivity extends AppCompatActivity implements NoteAdapter.OnItemClickListener {
    public static final int ADD_NOTE_REQUEST = 1;
    public static final int EDIT_NOTE_REQUEST = 2;
    NoteViewModel noteViewModel;
    List<Note> allNotes;
    RecyclerView rv;
    NoteAdapter adapter;
    FloatingActionButton floatingActionButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
        rv = (RecyclerView) findViewById(R.id.noterv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setHasFixedSize(true);
        noteViewModel = ViewModelProviders.of(this).get(NoteViewModel.class);

        noteViewModel.getAllnotes().observe(this, new Observer<List<Note>>() {
            @Override
            public void onChanged(List<Note> notes) {
                adapter = new NoteAdapter(notes);
                rv.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        });
    adapter.SetOnItemClickListener(this) ;

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), AddNoteActivity.class);
                startActivityForResult(intent, ADD_NOTE_REQUEST);
            }
        });
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                noteViewModel.delete(adapter.getAt(viewHolder.getAdapterPosition()));
                Toast.makeText(MainActivity.this, "note has been deleted", Toast.LENGTH_SHORT).show();
            }
        });
        itemTouchHelper.attachToRecyclerView(rv);

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ADD_NOTE_REQUEST && resultCode == RESULT_OK) {
            String title = data.getStringExtra("EXTRA_TITLE");
            String description = data.getStringExtra("EXTRA_DESCRIPTION");
            String time = data.getStringExtra("EXTRA_TIME");
            Note note = new Note(title, description, time);
            noteViewModel.insert(note);
        }
        else if(requestCode == EDIT_NOTE_REQUEST && resultCode == RESULT_OK){
            String title = data.getStringExtra("EXTRA_TITLE");
            String description = data.getStringExtra("EXTRA_DESCRIPTION");
            String time = data.getStringExtra("EXTRA_TIME");
            Note note = new Note(title, description, time);
            note.setId(data.getIntExtra("EXTRA_ID",-1));
            noteViewModel.update(note);
            Toast.makeText(this, "note has been updated", Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void OnItemClick(Note note) {
        Intent intent =new Intent(MainActivity.this,AddNoteActivity.class);
        intent.putExtra("EXTRA_ID",note.getId());
        intent.putExtra("EXTRA_TITLE",note.getTitle());
        intent.putExtra("EXTRA_DESCRIPTION",note.getDescription());
        intent.putExtra("EXTRA_TIME",note.getModified_time());
        startActivityForResult(intent,EDIT_NOTE_REQUEST);
    }
}

这是我的noteadapter.java文件

 package com.example.mynotes;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.NoteViewHolder> {
    OnItemClickListener listener;

    List<Note> notes=new ArrayList<>();
    public NoteAdapter(List<Note> notes) {
        this.notes = notes;
    }
    @NonNull
    @Override
    public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        // Inflate the custom layout
        View item_view = inflater.inflate(R.layout.single_note_item, parent, false);
        // Return a new holder instance
        NoteViewHolder viewHolder = new NoteViewHolder(item_view);

        return  viewHolder;
    }
    @Override
    public void onBindViewHolder(@NonNull NoteViewHolder holder, int position) {
        Note note =notes.get(position);
        holder.titletv.setText(note.getTitle());
        holder.datetv.setText(note.getModified_time());
    }
    @Override
    public int getItemCount() {
        return notes.size();
    }
    public class NoteViewHolder extends RecyclerView.ViewHolder{
        TextView titletv ;
        TextView datetv;
        public NoteViewHolder(@NonNull View itemView) {
            super(itemView);
            titletv=(TextView) itemView.findViewById(R.id.titletv);
            datetv=(TextView) itemView.findViewById(R.id.datetv);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener !=null && getAdapterPosition() != RecyclerView.NO_POSITION){
                        int position=getAdapterPosition();
                        listener.OnItemClick(notes.get(position));
                    }
                }
            });
        }
    }
    Note getAt(int position){
        return notes.get(position);
    }
    public interface OnItemClickListener{
        void OnItemClick(Note note);
    }
    public void SetOnItemClickListener(OnItemClickListener onItemClickListener){
        this.listener =onItemClickListener;
    }
}

这是我的logcat消息:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.mynotes.NoteAdapter.SetOnItemClickListener(com.example.mynotes.NoteAdapter$OnItemClickListener)' on a null object reference
    at com.example.mynotes.MainActivity.onCreate(MainActivity.java:52)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)

将此代码移至观察者

adapter.SetOnItemClickListener(this) ;

所以您的代码必须像这样

 noteViewModel.getAllnotes().observe(this, new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            adapter = new NoteAdapter(notes);
            adapter.SetOnItemClickListener(this);
            rv.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    });

在您的适配器中执行此操作,以及您将在活动中 new的适配器:

软件包com.example.mynotes;

公共类NoteAdapter扩展了RecyClerview.Adapter { OnItemClickListener侦听器;

List<Note> notes=new ArrayList<>();
public NoteAdapter(List<Note> notes, OnItemClickListener listener) {
    this.notes = notes;
    this.listener = listener;
}
@NonNull
@Override
public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);
    // Inflate the custom layout
    View item_view = inflater.inflate(R.layout.single_note_item, parent, false);
    // Return a new holder instance
    NoteViewHolder viewHolder = new NoteViewHolder(item_view);

    return  viewHolder;
}
@Override
public void onBindViewHolder(@NonNull NoteViewHolder holder, int position) {
    Note note =notes.get(position);
    holder.titletv.setText(note.getTitle());
    holder.datetv.setText(note.getModified_time());
}
@Override
public int getItemCount() {
    return notes.size();
}
public class NoteViewHolder extends RecyclerView.ViewHolder{
    TextView titletv ;
    TextView datetv;
    public NoteViewHolder(@NonNull View itemView) {
        super(itemView);
        titletv=(TextView) itemView.findViewById(R.id.titletv);
        datetv=(TextView) itemView.findViewById(R.id.datetv);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener !=null && getAdapterPosition() != RecyclerView.NO_POSITION){
                    int position=getAdapterPosition();
                    listener.OnItemClick(notes.get(position));
                }
            }
        });
    }
}
Note getAt(int position){
    return notes.get(position);
}
public interface OnItemClickListener{
    void OnItemClick(Note note);
}
public void SetOnItemClickListener(OnItemClickListener onItemClickListener){
    this.listener =onItemClickListener;
  }
}

现在,在您的活动中,您将新的适配器做到这一点:

adapter = new NoteAdapter(notes, NoteAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(Note note) {
                //DO WHATEVER YOU WANT HERE
            }

最新更新