【问题标题】:Expandable recyclerview and firebase可扩展的 recyclerview 和 firebase
【发布时间】:2017-09-08 02:21:45
【问题描述】:

我正在使用可扩展的 recyclerview 库 (this),为了填充这个 recyclerview,我正在使用 firebase 后端服务。我使用这个可扩展的 recyclerview 来显示聊天用户并且它有效。但是我的问题是,当有些人将在线状态从在线状态更改为离线状态时,我的recyclerview刷新并且在线状态更改后展开的所有组都崩溃了。

我的代码:

ViewHolder

组持有人

public class ClubNameViewHolder extends GroupViewHolder {

View view;
TextView clubName2;
CircleImageView clubLogoImg;
TextView onlineTexview;
FirebaseDatabase mDatabase;

public ClubNameViewHolder(View itemView) {
    super(itemView);
    view = itemView;
    clubName2 = (TextView) view.findViewById(R.id.clubName_Users);
    clubLogoImg = (CircleImageView) view.findViewById(R.id.parent_club_logo);
    onlineTexview = (TextView) view.findViewById(R.id.parent_online_text);
}

public void setClubTitle(ExpandableGroup club) {
    if (club instanceof UserChatGroup) {
        clubName2.setText(club.getTitle());

        Picasso.with(itemView.getContext()).load(((UserChatGroup) club).getClubLogo()).into(clubLogoImg);
        onlineTexview.setText(((UserChatGroup) club).getOnline());
    }

}
}

儿童持有人

public class UsersChatViewHolder extends ChildViewHolder {

View view;
TextView usernameUser;
CircleImageView flagUser;
CircleImageView profileImageUser;
ImageView onlineImage;
FirebaseAuth mAuth;

public UsersChatViewHolder(View itemView) {
    super(itemView);

    view = itemView;
    usernameUser = (TextView) view.findViewById(R.id.usernameUsers);
    flagUser = (CircleImageView) view.findViewById(R.id.flagUsers);
    profileImageUser = (CircleImageView) view.findViewById(R.id.profileUsers);
    onlineImage = (ImageView) view.findViewById(R.id.onlineStatus);
    mAuth = FirebaseAuth.getInstance();
}

public void setOnlineImage(){
    Log.i("online", String.valueOf(MainPage.myClubName));
    Log.i("online", String.valueOf(mAuth.getCurrentUser().getUid()));
    final DatabaseReference onlineReference = FirebaseDatabase.getInstance().getReference().child("UsersChat").child(MainPage.myClubName).child(mAuth.getCurrentUser().getUid());
    onlineReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            boolean isOnline = (boolean) dataSnapshot.child("online").getValue();
            Log.i("online", String.valueOf(isOnline));

            if (isOnline){
                onlineImage.setVisibility(View.VISIBLE);
            } else {
                onlineImage.setVisibility(View.GONE);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

public void setUsername (String username){
    usernameUser.setText(username);
}

public void setFlag(Context ctx, String flag){

    GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder;

    requestBuilder = Glide
            .with(ctx)
            .using(Glide.buildStreamModelLoader(Uri.class, ctx), InputStream.class)
            .from(Uri.class)
            .as(SVG.class)
            .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
            .sourceEncoder(new StreamEncoder())
            .cacheDecoder(new FileToStreamDecoder<SVG>(new SearchableCountry.SvgDecoder()))
            .decoder(new SearchableCountry.SvgDecoder())
            .animate(android.R.anim.fade_in);


    Uri uri = Uri.parse(flag);
    requestBuilder
            // SVG cannot be serialized so it's not worth to cache it
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .load(uri)
            .into(flagUser);

}

public void setProfileImage(Context ctx, String proifleImage){
    Picasso.with(ctx).load(proifleImage).into(profileImageUser);
}
}

型号

用户模型

public class UserChat {

String username;
String flag;
String profileImage;

public UserChat(String username, String flag, String profileImage) {
    this.username = username;
    this.flag = flag;
    this.profileImage = profileImage;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getFlag() {
    return flag;
}

public void setFlag(String flag) {
    this.flag = flag;
}

public String getProfileImage() {
    return profileImage;
}

public void setProfileImage(String profileImage) {
    this.profileImage = profileImage;
}
}

组模型

public class UserChatGroup extends ExpandableGroup {
String clubLogo;
String online;
public UserChatGroup(String title, List items,String clubLogo,String online) {
    super(title, items);

    this.clubLogo = clubLogo;
    this.online = online;
}

public String getClubLogo() {
    return clubLogo;
}

public void setClubLogo(String clubLogo) {
    this.clubLogo = clubLogo;
}

public String getOnline() {
    return online;
}

public void setOnline(String online) {
    this.online = online;
}


}

适配器

public class ClubNameChatAdapter extends ExpandableRecyclerViewAdapter<ClubNameViewHolder, UsersChatViewHolder> {
Context ctx;

public ClubNameChatAdapter(List<? extends ExpandableGroup> groups, Context ctx) {
    super(groups);
    this.ctx = ctx;
}

@Override
public ClubNameViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.parent_layout_users, parent, false);

    return new ClubNameViewHolder(view);
}

@Override
public UsersChatViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_layout_users, parent, false);

    return new UsersChatViewHolder(view);
}

@Override
public void onBindChildViewHolder(UsersChatViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {

    UserChat userChat = (UserChat) group.getItems().get(childIndex);
    holder.setUsername(userChat.getUsername());
    holder.setFlag(ctx, userChat.getFlag());
    holder.setProfileImage(ctx, userChat.getProfileImage());
    holder.setOnlineImage();

}

@Override
public void onBindGroupViewHolder(ClubNameViewHolder holder, int flatPosition,     ExpandableGroup group) {
    holder.setClubTitle(group);
}
}

片段

public class FragmentChatUsers extends Fragment {

RecyclerView userRecylerView;
ClubNameChatAdapter adapter;
List<UserChatGroup> clubName;
DatabaseReference userReference;
String profileImage;
String username;
String flag;
String clubNameLogo;
boolean isOnline;
int numberOnline;
String online;


public void getClubName() {
    userReference = FirebaseDatabase.getInstance().getReference().child("UsersChat");

    userReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            clubName = new ArrayList<UserChatGroup>();
            for (final DataSnapshot snapshot : dataSnapshot.getChildren()){


                final String clubNameString = snapshot.getKey().toString();

                DatabaseReference chatReference = FirebaseDatabase.getInstance().getReference().child("UsersChat").child(clubNameString);
                chatReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        final List<UserChat> userChats = new ArrayList<UserChat>();
                        numberOnline = 0;
                        for (DataSnapshot snapshot1 : dataSnapshot.getChildren()) {

                            username = String.valueOf(snapshot1.child("username").getValue());
                            profileImage = String.valueOf(snapshot1.child("profileImage").getValue());
                            flag = String.valueOf(snapshot1.child("flag").getValue());
                            clubNameLogo = String.valueOf(snapshot1.child("favoriteClubLogo").getValue());
                            isOnline = (boolean) snapshot1.child("online").getValue();

                            if (isOnline){
                                numberOnline++;
                            }

                            online = String.valueOf(numberOnline);



                            userChats.add(new UserChat(username, flag, profileImage));
                        }
                            clubName.add(new UserChatGroup(clubNameString, userChats, clubNameLogo, online));


                        adapter = new ClubNameChatAdapter(clubName, getContext());
                        userRecylerView.setLayoutManager(new LinearLayoutManager(getContext()));
                        userRecylerView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });



            }

        }


        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

@Override
public void onStart() {
    super.onStart();

    DatabaseReference setOfline = FirebaseDatabase.getInstance().getReference().child("UsersChat").child(MainPage.myClubName).child(MainPage.uid);
    setOfline.child("online").setValue(true);
}

@Override
public void onDestroy() {
    super.onDestroy();

    DatabaseReference setOfline = FirebaseDatabase.getInstance().getReference().child("UsersChat").child(MainPage.myClubName).child(MainPage.uid);
    setOfline.child("online").setValue(false);
}

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

    userRecylerView = (RecyclerView) view.findViewById(R.id.chatUserRecView);
    getClubName();

    return view;
}
}

【问题讨论】:

    标签: android firebase-realtime-database android-recyclerview expand


    【解决方案1】:

    问题解决,修改addListenerForSingleValueEvent中的addValueEventListener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2016-11-20
      相关资源
      最近更新 更多