java Android Studio:尝试单击列表中的对象并启动新活动时出现NullPointerException
我有一个房间数据库,包含一个成员列表。列表中有不同的成员。我想点击一个特定的成员,然后它应该开始一个新的活动,在那里我可以看到关于该成员的其他信息。但是当我点击一个成员时,应用程序崩溃了
我的适配器的代码:
public class MemberListAdapter extends RecyclerView.Adapter<MemberListAdapter.MemberViewHolder> {
private List<Member> mMember;
private MemberClickListener listener;
public interface MemberClickListener {
void onMemberClick(int position);
}
public MemberListAdapter(final MemberClickListener listener) {
this.listener = listener;
}
@Override
public MemberViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_member, parent, false);
return new MemberViewHolder(itemView, listener);
}
void setMember(List<Member> members) {
mMember = members;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (mMember != null)
return mMember.size();
else return 0;
}
@Override
public void onBindViewHolder(MemberViewHolder holder, int position) {
holder.bind(mMember.get(position), listener);
}
class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final MemberClickListener listener;
private final TextView firstname;
private final TextView surname;
private final TextView balance;
MemberViewHolder(View itemView, MemberClickListener listener) {
super(itemView);
firstname = itemView.findViewById(R.id.layout_firstname);
surname = itemView.findViewById(R.id.layout_surname);
balance = itemView.findViewById(R.id.layout_balance);
this.listener = listener;
itemView.setOnClickListener(this);
}
public void bind(final Member member, final MemberClickListener listener) {
firstname.setText(member.getFirstname());
surname.setText(member.getSurname());
//balance.setText(toString(member.getBalance()));
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("test1", "beforelistenercheck");
if (listener != null) {
Log.i("test2", "duringlistenercheck");
listener.onMemberClick(getAdapterPosition());
Log.i("test3", "aftergettingposition");
}
}
});
}
public void onClick(View v) {
if (listener != null) {
********listener.onMemberClick(getAdapterPosition());********
}
}
}
}
我的主要活动代码:
public class MemberMainActivity extends AppCompatActivity implements MemberListAdapter.MemberClickListener{
private MemberViewModel mMemberViewModel;
private List<Member> mMember;
void setMember(List<Member> members) {
mMember = members;
}
public static final int NEW_MEMBER_ACTIVITY_REQUEST_CODE = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_member);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MemberMainActivity.this, NewMemberActivity.class);
startActivityForResult(intent, NEW_MEMBER_ACTIVITY_REQUEST_CODE);
}
});
RecyclerView recyclerView = findViewById(R.id.recyclerviewcard_member);
final MemberListAdapter adapter = new MemberListAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
mMemberViewModel = ViewModelProviders.of(this).get(MemberViewModel.class);
mMemberViewModel.getAllMember().observe(this, new Observer<List<Member>>() {
@Override
public void onChanged(@Nullable final List<Member> members) {
// Update the cached copy of the words in the adapter.
adapter.setMember(members);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == NEW_MEMBER_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
Member member = new Member(data.getStringExtra(NewMemberActivity.EXTRA_REPLY), data.getStringExtra(NewMemberActivity.EXTRA_REPLY2));
mMemberViewModel.insert(member);
} else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}
public void onMemberClick(int position) {
**********Member member = mMember.get(position);**********
MemberInfo.open(this, member.getId());
}
}
单击成员后应启动的活动代码:
public class MemberInfo extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memberinfo);
Intent intent = getIntent();
if (intent != null && intent.hasExtra("MemberID")) {
long memberid = intent.getLongExtra("MemberID", -1);
// TODO: get customer details based on customer id
Bundle bundle = new Bundle();
bundle.putLong("MemberID", memberid);
intent.putExtras(bundle);
startActivity(intent);
}
else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}
public static void open(Activity activity, long memberid) {
Intent intent = new Intent(activity, MemberInfo.class);
intent.putExtra("MemberID", memberid);
activity.startActivity(intent);
}
}
错误:
logcat: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
at com.example.ahash.mainbuchhaltung.Member.MemberMainActivity.onMemberClick(MemberMainActivity.java:81)
at com.example.ahash.mainbuchhaltung.Member.MemberListAdapter$MemberViewHolder$1.onClick(MemberListAdapter.java:86)
at 安卓.view.View.performClick(View.java:6256)
at 安卓.view.View$PerformClick.run(View.java:24701)
at 安卓.os.Handler.handleCallback(Handler.java:789)
at 安卓.os.Handler.dispatchMessage(Handler.java:98)
at 安卓.os.Looper.loop(Looper.java:164)
at 安卓.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我用星星标出了错误所在的线条。 我还试图用这个问题的答案来解决我的问题:What is a NullPointerException, and how do I fix it?
我的适配器代码中有三个不同的日志,分别名为“test1”、“test2”和“test3”。我模拟了我的应用程序,“test1”和“test2”显示在我的日志中,但“test3”没有显示
我已经在这方面工作了三个星期,但我仍然面临着和以前一样的问题。有人能帮我解决这个问题吗
# 1 楼答案
我使用您的代码创建了一个新项目,而您忘记初始化名为“mMember”的成员列表
我创建了一个加载假成员的方法,一切都正常工作
例如:
# 2 楼答案
onMemberClick方法中的
mMember
为空# 3 楼答案
当您访问主活动中的
private List<Member> mMember
时,它没有初始化(很可能是在侦听器中)您可以改为
private List<Member> mMember = new ArrayList<Member();
,并且至少有一个空列表或者,您可以在
onCreate()
中的mMemberViewModel.getAllMember().observe(this, new Observer<List<Member>>()
之前插入mMember = new ArrayList<Member>();