Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView延迟显示其项目_Android_Firebase_Android Recyclerview_Firebase Realtime Database - Fatal编程技术网

Android RecyclerView延迟显示其项目

Android RecyclerView延迟显示其项目,android,firebase,android-recyclerview,firebase-realtime-database,Android,Firebase,Android Recyclerview,Firebase Realtime Database,我正在从数据存储在Firebase数据库中的对象填充RecyclerView回收视图显示当前正在使用该应用程序的用户。 虽然在显示器关闭并再次打开之前,RecyclerView不会显示所有数据,但所有数据都已正确获取。显示器打开后,RecyclerView将填充其项目。我使用调试来发现问题。在调试时,它工作得很好。但是当涉及到运行应用程序时,问题又回来了。如果有人能帮我解决这个问题,我将不胜感激。 我已经在下面发布了我的代码 protected void onStart() { supe

我正在从数据存储在
Firebase
数据库中的对象填充
RecyclerView
<代码>回收视图显示当前正在使用该应用程序的用户。 虽然在显示器关闭并再次打开之前,
RecyclerView
不会显示所有数据,但所有数据都已正确获取。显示器打开后,
RecyclerView
将填充其项目。我使用调试来发现问题。在调试时,它工作得很好。但是当涉及到运行应用程序时,问题又回来了。如果有人能帮我解决这个问题,我将不胜感激。 我已经在下面发布了我的代码

protected void onStart() {
    super.onStart();
    mClient.connect();
    childEventListener = tempUserRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if (dataSnapshot.exists()) {
                UserDetailsClass userDetailsClass = dataSnapshot.getValue(UserDetailsClass.class);

                if (!userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
                    myFriendsAdapter.refillAdapter(userDetailsClass);
                }
                if (userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
                    sender = userDetailsClass.getName();
                }
            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}
适配器类

public class MyFriendsAdapter extends RecyclerView.Adapter<MyFriendsAdapter.MyFriendsViewHolder> {

Context context;
ClickListener clickListener;
List<UserDetailsClass> friendsList;

public MyFriendsAdapter(Context context, List<UserDetailsClass> friendsList) {
    this.context = context;
    this.friendsList = friendsList;
}

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

@Override
public void onBindViewHolder(MyFriendsViewHolder holder, int position) {
    TextView name = holder.getName();
    name.setText(friendsList.get(position).getName());
    holder.getStateName().setText(friendsList.get(position).getStateName());
    setOnlineStatus(holder, position);
}

private void setOnlineStatus(MyFriendsViewHolder holder, int position) {
    if (friendsList.get(position).getOnline_offline_status() == 1) {
        holder.getOnline_offline().setText("Online");
        holder.getOnline_offline().setTextColor(Color.GREEN);
    }
}

@Override
public int getItemCount() {
    if (friendsList == null) {
        return 0;
    } else {
        return friendsList.size();
    }
}

public void refillAdapter(UserDetailsClass userDetailsClass) {
    friendsList.add(userDetailsClass);
}

public void cleanUp() {
    friendsList.clear();
}

public void setClickListener(ClickListener clickListener) {
    this.clickListener = clickListener;
}

class MyFriendsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView name;
    private TextView online_offline;
    private TextView stateName;
    private TextView distance;

    public MyFriendsViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.textView3);
        online_offline = (TextView) itemView.findViewById(R.id.online);
        stateName = (TextView) itemView.findViewById(R.id.textView4);
        distance = (TextView) itemView.findViewById(R.id.textView13);
        itemView.setOnClickListener(this);

    }

    public TextView getName() {
        return name;
    }

    public void setName(TextView name) {
        this.name = name;
    }

    public TextView getOnline_offline() {
        return online_offline;
    }

    public void setOnline_offline(TextView online_offline) {
        this.online_offline = online_offline;
    }

    public TextView getStateName() {
        return stateName;
    }

    public void setStateName(TextView stateName) {
        this.stateName = stateName;
    }

    public TextView getDistance() {
        return distance;
    }

    public void setDistance(TextView distance) {
        this.distance = distance;
    }

    @Override
    public void onClick(View view) {
        if (clickListener != null) {
            String name = friendsList.get(getPosition()).getName();
            clickListener.itemClick(view, getPosition(), name);
            //friendsList.get(getPosition()).getName();
        }
    }

}

public interface ClickListener {

    void itemClick(View view, int position, String name);
}

}
公共类MyFriendsAdapter扩展了RecyclerView.Adapter{
语境;
点击监听器点击监听器;
列出朋友名单;
公共MyFriendsAdapter(上下文,列表friendsList){
this.context=上下文;
this.friendsList=friendsList;
}
@凌驾
公共MyFriendsViewHolder onCreateViewHolder(视图组父级,int-viewType){
MyFriendsViewHolder;
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
视图=充气机。充气(R.layout.friend_online,parent,false);
viewHolder=newmyfriendsviewholder(视图);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(MyFriendsViewHolder,int位置){
TextView name=holder.getName();
name.setText(friendsList.get(position.getName());
holder.getStateName().setText(friendsList.get(position.getStateName());
设置联机状态(支架、位置);
}
私有无效设置联机状态(MyFriendsViewHolder持有者,内部位置){
if(friendsList.get(position).getOnline\u offline\u status()==1){
holder.getOnline_offline().setText(“联机”);
holder.getOnline\u offline().setTextColor(Color.GREEN);
}
}
@凌驾
public int getItemCount(){
if(friendsList==null){
返回0;
}否则{
return friendsList.size();
}
}
公共void重新填充适配器(UserDetailsClass UserDetailsClass){
添加(userDetailsClass);
}
公共空间清理(){
friendsList.clear();
}
公共无效设置ClickListener(ClickListener ClickListener){
this.clickListener=clickListener;
}
类MyFriendsViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
私有文本视图名称;
私人文本查看在线和离线;
私有文本视图状态名;
私有文本视图距离;
公共MyFriendsViewHolder(查看项目视图){
超级(项目视图);
name=(TextView)itemView.findViewById(R.id.textView3);
online\u offline=(TextView)itemView.findViewById(R.id.online);
stateName=(TextView)itemView.findViewById(R.id.textView4);
距离=(TextView)itemView.findViewById(R.id.textView13);
setOnClickListener(这个);
}
公共文本视图getName(){
返回名称;
}
public void setName(TextView名称){
this.name=名称;
}
公共文本视图getOnline_offline(){
在线返回或离线返回;
}
public void setOnline\u offline(TextView online\u offline){
this.online\u offline=online\u offline;
}
公共文本视图getStateName(){
返回stateName;
}
public void setStateName(TextView stateName){
this.stateName=stateName;
}
公共文本视图getDistance(){
返回距离;
}
公共空间设置距离(文本视图距离){
这个距离=距离;
}
@凌驾
公共void onClick(视图){
如果(clickListener!=null){
String name=friendsList.get(getPosition()).getName();
clickListener.itemClick(视图,getPosition(),名称);
//get(getPosition()).getName();
}
}
}
公共界面ClickListener{
void itemClick(视图、int位置、字符串名称);
}
}

使用Firebase的数据填充RecyclerView中的列表项的最佳方法是使用FirebaseRecyclerAdapter。查看这些说明以了解更多信息:


正如您所看到的,在add方法之后,您还没有添加
notifydatasetchanged()
,您需要通知适配器您已经添加了一个项,因为您缺少
notifydatasetchanged()

将其添加到此处:

if (!userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
    myFriendsAdapter.refillAdapter(userDetailsClass);
    myFriendsAdapter.notifyDataSetChanged();
}
或在此:

public void refillAdapter(UserDetailsClass userDetailsClass) {
    friendsList.add(userDetailsClass);
    notifyDataSetChanged();
}

public void cleanUp() {
    friendsList.clear();
    notifyDataSetChanged();
}

你忘了在add之后调用notifydatasetchanged()听起来像是一个答案@ColdFire:-)@FrankvanPuffelen是的one@panduka如果答案是正确的,请接受helped@ColdFire对不起,我来晚了。它工作得非常好。你帮了我大忙。非常感谢你。