[英]Call a method from Adapter to Fragment and pass a variable with it Android Studio
所以我想要的是从我的回收器视图中单击一个按钮,应该调用我的片段中的方法/函数,同时它也应该发送一个变量。 我知道我可以使用侦听器或接口,但我已经查看并实现了几种解决方案,但它们通常都不起作用通过查看我的代码,我也从适配器中删除了一些不必要的部分。
适配器
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();
}
}
这是logcat
java.lang.NullPointerException: Attempt to invoke interface method 'void com.margsapp.messenger.Adapter.AddPartAdapter$EventListener.AddParticipant(java.lang.String)' on a null object reference at com.margsapp.messenger.Adapter.AddPartAdapter$1 .onClick(AddPartAdapter.java:70) at android.view.View.performClick(View.java:7125) at android.view.View.performClickInternal(View.java:7102) at android.view.View.access$3500(View .java:801) at android.view.View$PerformClick.run(View.java:27336) at android.os.Handler.handleCallback(Handler.Z93F725A07423FE1C889F448B33D21F4 6Z:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java :930)
试试这个方法
在您的适配器 class 中,创建 2 个方法。 添加和删除监听器。
public addEventListener(EventListener listener){
this.listener = listener;
}
public removeEventListener(){
listener = null;
}
片段 class
public class AddParticipantsFragment extends Fragment implements AddPartAdapter.EventListener {
private RecyclerView recyclerView;
private List<User> mUsers;
DatabaseReference databaseReference;
FirebaseUser firebaseUser;
private List<Chatlist>usersList;
public String groupId;
private AddPartAdapter addPartAdapter
@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 = new AddPartAdapter(getContext(), mUsers);
adapter.addEventListener(this)
recyclerView.setAdapter(addPartAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
//This is the method that should be called and id is the variable I want
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);
}
override fun onDestroy() {
super.onDestroy()
adapter.removeEventListener()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.