【发布时间】:2021-06-14 00:25:21
【问题描述】:
所以我想要的是在我的回收站视图中单击一个按钮,我的片段中的方法/函数应该被调用,同时它也应该发送一个变量。我知道我可以使用侦听器或接口,但我已经查看并实现了几个解决方案,但它们都没有工作通常是空指针异常我不知道在做什么错误所以如果有人让我知道如何做会很有帮助通过查看我的代码,我也从适配器中删除了一些不必要的部分..
适配器
public class AddPartAdapter extends RecyclerView.Adapter<AddPartAdapter.ViewHolder> {
private Context mContext;
private List<User> mUsers;
EventListener listener;
public interface EventListener {
void AddParticipant(String id);
}
public void addEventListener(EventListener listener){
this.listener = listener;
}
public void removeEventListener(){
listener = null;
}
public AddPartAdapter(Context mContext, List<User> mUsers) {
this.mContext = mContext;
this.mUsers = mUsers;
}
@NonNull
@Override
public AddPartAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.add_part_item, parent, false);
return new AddPartAdapter.ViewHolder(viewGroup);
}
@Override
public void onBindViewHolder(@NonNull AddPartAdapter.ViewHolder holder, int position) {
final User user = mUsers.get(position);
holder.username.setText(user.getUsername());
holder.dt.setText(user.getDt());
if (user.getImageUrl().equals("default")) {
holder.dp.setImageResource(R.drawable.user);
} else {
Glide.with(mContext).load(user.getImageUrl()).into(holder.dp);
}
holder.addpart_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String Variable = user.getId();//This is the variable that should pass
//Send call that method and send the variablethat variable to Fragment
listener.AddParticipant(Variable);
}
});
}
片段
public class AddParticipantsFragment extends Fragment implements AddPartAdapter.EventListener {
private RecyclerView recyclerView;
private List<User> mUsers;
DatabaseReference databaseReference;
FirebaseUser firebaseUser;
private List<Chatlist>usersList;
private AddPartAdapter addPartAdapter;
public String groupId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_add_participants, container, false);
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
usersList = new ArrayList<>();
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
databaseReference = FirebaseDatabase.getInstance().getReference("Chatlist").child(firebaseUser.getUid());
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
usersList.clear();
for(DataSnapshot snapshot1 : snapshot.getChildren()){
Chatlist chatlist = snapshot1.getValue(Chatlist.class);
usersList.add(chatlist);
}
chatList();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
AddParticipants activity = (AddParticipants) getActivity();
assert activity != null;
groupId = activity.getMyData();
return view;
}
private void chatList() {
mUsers = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("Users");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
mUsers.clear();
for (DataSnapshot snapshot1 : snapshot.getChildren()){
User user = snapshot1.getValue(User.class);
for (Chatlist chatlist : usersList){
assert user != null;
if(user.getId().equals(chatlist.getId())){
if(chatlist.getFriends().equals("Messaged")){
mUsers.add(user);
}if (chatlist.getFriends().equals("Requested")){
//DoNothing
}
if(chatlist.getFriends().equals("Blocked")){
//Dont do anything
}
}
}
}
AddPartAdapter addPartAdapter = new AddPartAdapter(getContext(), mUsers);
addPartAdapter.addEventListener();//Here inside the bracket what to add.
recyclerView.setAdapter(addPartAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
public void AddParticipant(String id) {
//And it should initialize this method
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Grouplist").child(groupId);
HashMap<String, String> hashMap1 = new HashMap<>();
hashMap1.put("id", id);
hashMap1.put("admin","false");
databaseReference.setValue(hashMap1);
}
public void onDestroy() {
super.onDestroy();
addPartAdapter.removeEventListener();
}
}
这是日志猫
java.lang.NullPointerException:尝试在空对象引用上调用接口方法“void com.margsapp.messenger.Adapter.AddPartAdapter$EventListener.AddParticipant(java.lang.String)” 在 com.margsapp.messenger.Adapter.AddPartAdapter$1.onClick(AddPartAdapter.java:70) 在 android.view.View.performClick(View.java:7125) 在 android.view.View.performClickInternal(View.java:7102) 在 android.view.View.access$3500(View.java:801) 在 android.view.View$PerformClick.run(View.java:27336) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
【问题讨论】:
-
你能添加你的监听器实现代码吗?还有 NPE 错误日志
-
是的,我会编辑问题。
-
我已经添加了监听器和日志,请您检查并告诉问题出在哪里?
-
是的,它会与 NPE 一起崩溃。您正在创建 2 个适配器实例。在 1 个实例中,您正在传递侦听器,在 1 个实例中,您正在传递上下文和用户列表数据。
标签: android android-studio android-fragments android-recyclerview android-adapter