作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Room 数据库,其中包含成员列表。列表中有不同的成员。我想单击某个特定成员,然后它应该启动一个新 Activity ,我可以在其中查看有关该成员的其他信息。但是当我点击某个成员时,应用程序崩溃了。
我的适配器代码:
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());********
}
}
}
}
我的主要 Activity 代码:
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());
}
}
点击成员(member)后应启动的 Activity 代码:
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 android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我用星号标记了错误所在的行。我还尝试通过以下问题的答案来解决我的问题:What is a NullPointerException, and how do I fix it?
我的适配器代码中有三个不同的日志,名为“test1”、“test2”和“test3”。我模拟了我的应用程序,“test1”和“test2”显示在我的 logcat 中,但“test3”未显示。
我已经为此工作了三个星期,但我仍然遇到与以前相同的问题。谁能帮我解决这个问题吗?
最佳答案
您的 mMember
在 onMemberClick 方法中为 null。
关于java - Android Studio : NullPointerException when trying to click on a object in a list and start a new activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50845552/
我是一名优秀的程序员,十分优秀!