2016-09-03 56 views
2

我从其数据存储在Firebase数据库中的对象填充RecyclerViewRecyclerView显示当前正在使用该应用程序的用户。 虽然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); 
} 

} 
+2

你忘了打电话给notifydatasetchanged()之后添加 –

+0

听起来像一个答案@ColdFire :-) –

+0

@FrankvanPuffelen啊这是一个 –

回答

1

正如你可以看到你还没有添加方法后添加notifydatasetchanged(),你需要通知你已经通过

+0

谢谢你的回答,它完美的工作 –

0

使用填充与从火力地堡数据RecyclerView列表中的项目,最好的办法是使用FirebaseRecyclerAdapter。看看这些指令的详细信息:

FirebaseUI-database

1

您是将产品添加适配器缺少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(); 
}