相关文章推荐
风度翩翩的凳子  ·  java http chunked ...·  1 年前    · 
灰常酷的楼房  ·  JavaScript禁用鼠标 ...·  1 年前    · 
登录

从Adapter调用一个方法到片段,并通过它传递一个变量

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2021-03-18
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2021-03-16 17:07

因此,我想要的是点击一个按钮,从我的回收者的观点,一个方法/函数,在我的片段应该被调用,同时它也应该发送一个变量。我知道我可以使用监听器或接口,但我已经查找并实现了几种解决方案,但它们都没有工作,通常都是空指针异常,我不知道在做什么错误,所以如果有人通过查看我的代码让我知道如何准确地执行,我也从我的适配器中删除了一些不必要的部分。

适配器

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();
}

在这里,这只大猫

com.margsapp.messenger.Adapter.AddPartAdapter$EventListener.AddParticipant(java.lang.String)‘:尝试在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上调用空对象引用上的接口方法’android.view.View$PerformClick.run(View.java:27336)‘android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214),android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(原生方法),com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

浏览 1 关注 0 得票数 1
  • 得票数为Stack Overflow原文数据
原文
回答于2021-03-18
得票数 1

试试这边,

在适配器类中,创建2个方法。添加和删除侦听器。

public addEventListener(EventListener listener){
    this.listener = listener;
public removeEventListener(){
   listener = null;
}

碎片类

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);