Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在设置回收器项单击侦听器时获取空指针异常_Java_Android_Android Recyclerview_Nullpointerexception - Fatal编程技术网

Java 在设置回收器项单击侦听器时获取空指针异常

Java 在设置回收器项单击侦听器时获取空指针异常,java,android,android-recyclerview,nullpointerexception,Java,Android,Android Recyclerview,Nullpointerexception,我搜索了很多,没有找到任何解决问题的方法。我创建了一个界面,用于处理回收器视图中特定项目的单击侦听器。Logcat显示在活动中设置侦听器时出错 这是我的MainActivity.java文件 package com.example.mynotes; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Toast; import andro

我搜索了很多,没有找到任何解决问题的方法。我创建了一个界面,用于处理回收器视图中特定项目的单击侦听器。Logcat显示在活动中设置侦听器时出错

这是我的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);
    }
}
 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;
    }

}

将此代码移到observer

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();
        }
    });
noteViewModel.getAllnotes().observe(这是一个新的观察者(){
@凌驾
更改后的公共作废(列表注释){
适配器=新的NoteAdapter(notes);
adapter.SetOnItemClickListener(此);
rv.设置适配器(适配器);
adapter.notifyDataSetChanged();
}
});

在适配器中执行此操作,并在活动中将
新建
适配器的位置执行此操作:

包com.example.mynotes

公共类NoteAdapter扩展了RecyclerView.Adapter{ 听者,听者

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;
  }

}

您的适配器仅在视图模型的onchanged回调中设置,并且您正在尝试在回调到达之前在适配器对象上设置侦听器,这就是适配器为空的原因。请尝试在onchanged回调中设置侦听器。感谢@raxerz解释此问题……现在我已经理解了。。。。
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
            }