Адаптер представления Recycler теперь отображает данные фрагментом - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь отобразить данные из моей базы данных в моем фрагменте через представление переработчика. Я использовал для l oop до go через всех пользователей в моей базе данных. Все пользователи, которые не являются ни друзьями, ни отправившими запросы, должны отображаться как реализованные в условии if класса фрагмента. Код для фрагмента класса написан ниже.

public class AddMemberFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private View view ;
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
    String userId;
    String n_team ;
    ArrayList<Friend> friends;


    public AddMemberFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.addnewfriend_fragment, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        userId = firebaseUser.getUid();
        ManageTeamTabbedActivity activity = (ManageTeamTabbedActivity) getActivity();
        n_team = activity.getMyData();
        mRecyclerView = (RecyclerView) getView().findViewById(R.id.addNewFriend);
        //mRecyclerView.setHasFixedSize(true);//
        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        friends = new ArrayList<>();
        mAdapter = new AddMemberAdapter(getActivity(), friends, n_team) ;
        mRecyclerView.setAdapter(mAdapter);

        mRootRef.child("users");
        mRootRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<Friend> friendArrayList = new ArrayList<>();
                DataSnapshot friendsData = dataSnapshot.child(firebaseUser.getUid()).child("friends");
                DataSnapshot requests = null;
                DataSnapshot currentFriends = null;
                if (friendsData.hasChild("requests")) {
                    requests = dataSnapshot.child(firebaseUser.getUid()).child("friends").child("requests");
                }
                if (friendsData.hasChild("currentFriends")) {
                    currentFriends = dataSnapshot.child(firebaseUser.getUid()).child("friends").child("currentFriends");
                }

                for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                    Log.d("demo", "USERID " + FirebaseAuth.getInstance().getCurrentUser().getUid());
                    Friend friend = new Friend();
                    if ((userSnapshot.getKey().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) || (requests != null && requests.hasChild(userSnapshot.getKey()))
                            || (currentFriends != null && currentFriends.hasChild(userSnapshot.getKey()))) {

                    } else {
                        friend.setId(userSnapshot.getKey());
                        friend.setFriendName((String) userSnapshot.child("profiles").child("fname").getValue());
                        friendArrayList.add(friend);
                    }
                }
                friends = friendArrayList;
                if (friends != null && !friends.isEmpty()) {
                    mAdapter.setFriendList(friends);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

И соответствующий код адаптера написан здесь:

public class AddMemberAdapter extends RecyclerView.Adapter<AddMemberAdapter.RecyclerViewHolder>{

    private ArrayList<Friend> mData;
    private Context mContext;
    private FirebaseAuth auth;
    private String u_team ;

    public AddMemberAdapter(Context mContext, ArrayList<Friend> friendList , String u_team) {
        this.mData = friendList;
        this.mContext = mContext;
        this.u_team= u_team;
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addnewfriend_layout, parent, false);
        AddMemberAdapter.RecyclerViewHolder viewHolder = new AddMemberAdapter.RecyclerViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, final int position) {
        final Friend frnd =(Friend) mData.get(position);

        holder.friendName.setText(frnd.getFriendName());
        holder.addFriend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                frnd.setStatus("sent");
                final DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
                final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
                final String UID = firebaseUser.getUid();
                mRootRef.child("users").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        mRootRef.child("users").child(UID).child("friends").child("requests").child(frnd.getId()).setValue(frnd);
                        Friend temp = new Friend();
                        temp.setId(firebaseUser.getUid());
                        temp.setFriendName(firebaseUser.getDisplayName());
                        temp.setStatus("received");
                        mRootRef.child("users").child(frnd.getId()).child("friends").child("requests").child(firebaseUser.getUid()).setValue(temp);
                        mData.remove(frnd);
                        notifyDataSetChanged();
                    }

                    @Override

                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    public class RecyclerViewHolder extends RecyclerView.ViewHolder {
        TextView friendName;
        ImageButton addFriend;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            friendName = (TextView)itemView.findViewById(R.id.textViewFriendName);
            addFriend = (ImageButton) itemView.findViewById(R.id.imagebuttonFriendAdd);
        }
    }

    public void setFriendList(ArrayList<Friend> friendList){
        this.mData = friendList;
        notifyDataSetChanged();
    }
}

Вывод, который я получаю, прилагается здесь.

enter image description here

Пользователи, которые не являются друзьями и не были отправлены запросы на добавление в друзья текущего пользователя, должны отображаться в этом фрагменте Добавить нового участника через этот RecyclerView. Я попытался отладить его сам и удалил условие if, но оно тоже не сработало. Пожалуйста, руководство, как отобразить его.

Скриншот базы данных также прилагается.

enter image description here

1 Ответ

0 голосов
/ 21 марта 2020

Я не смог найти проблему с вашим запросом в firebase и методами извлечения данных, однако, с этой структурой данных, так как список растет, вам будет трудно получить список ваших друзей. Насколько я понимаю, отображение этого фрагмента занимает много времени.

Кроме того, вы можете подумать о настройке адаптера с RecyclerView во время инициализации RecyclerView.

Вы можете подумать о том, чтобы сделать что-то вроде следующего.

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    userId = firebaseUser.getUid();
    ManageTeamTabbedActivity activity = (ManageTeamTabbedActivity) getActivity();
    n_team = activity.getMyData();
    mRecyclerView = (RecyclerView) getView().findViewById(R.id.addNewFriend);
    // mRecyclerView.setHasFixedSize(true); // Remove this line
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);

    // Set the adapter here with an empty list first. 
    friends = new ArrayList<>();
    mAdapter = new AddMemberAdapter(getActivity(), friends, n_team);
    mRecyclerView.setAdapter(mAdapter);

    mRootRef.child("users");
    mRootRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<Friend> friendArrayList = new ArrayList<>();
            DataSnapshot friendsData = dataSnapshot.child(firebaseUser.getUid()).child("friends");
            DataSnapshot requests = null;
            DataSnapshot currentFriends = null;
            if (friendsData.hasChild("requests")) {
                requests = dataSnapshot.child(firebaseUser.getUid()).child("friends").child("requests");
            }
            if (friendsData.hasChild("currentFriends")) {
                currentFriends = dataSnapshot.child(firebaseUser.getUid()).child("friends").child("currentFriends");
            }

            for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                Log.d("demo", "USERID " + FirebaseAuth.getInstance().getCurrentUser().getUid());
                Friend friend = new Friend();
                if ((userSnapshot.getKey().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) || (requests != null && requests.hasChild(userSnapshot.getKey()))
                        || (currentFriends != null && currentFriends.hasChild(userSnapshot.getKey()))) {

                } else {
                    friend.setId(userSnapshot.getKey());
                    friend.setFriendName((String) userSnapshot.child("profiles").child("fname").getValue());
                    friendArrayList.add(friend);
                }
            }
            friends = friendArrayList;
            if (friends != null && !friends.isEmpty()) {
                mAdapter.setFriendList(friends); // Set the friend list to the adapter when the list is loaded. 
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

И в вашем адаптере вам понадобится функция для настройки списка друзей и вызова notifyDataSetChanged().

// In your adapter class, add the following method. 
public void setFriendList(ArrayList<Friend> friendList) {
    this.mData = friendList;
    notifyDataSetChanged();
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...