有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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”没有显示

我已经在这方面工作了三个星期,但我仍然面临着和以前一样的问题。有人能帮我解决这个问题吗


共 (3) 个答案

  1. # 1 楼答案

    我使用您的代码创建了一个新项目,而您忘记初始化名为“mMember”的成员列表

    我创建了一个加载假成员的方法,一切都正常工作

    例如:

    private void loadFakeData(){
            mMember = new ArrayList<>();
            Member newMember;
            for (int i = 0; i < 10; i++) {
                newMember = new Member();
                newMember.setFirstName("Firstname " + i);
                newMember.setSurName("Surname " + i);
    
                mMember.add(newMember);
            }
            mAdapter.setMember(mMember);
        }
    
  2. # 2 楼答案

    onMemberClick方法中的mMember为空

  3. # 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>();