2

データがFirebaseデータベースに格納されているオブジェクトからRecyclerViewを入力しています。 RecyclerViewには、現在アプリを使用しているユーザーが表示されます。 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

が)後 –

+0

が –

+0

@FrankvanPuffelen :-)回答@ColdFireのような音を追加ええ、それがために –

答えて

1

あなたはaddメソッドの後にnotifydatasetchanged()を追加しましたhaventは見ることができるように、あなたはあなたがしていること

+0

あなたの答えをありがとう、それは完璧に働いた –

0

FirebaseからのデータとRecyclerViewにリスト項目を取り込むために使用するための最良の方法は、FirebaseRecyclerAdapterを使用することです。詳細については、これらの命令をチェックアウト:

FirebaseUI-database

1

て項目を追加したアダプタに通知する必要がありますnotifyDataSetChanged()

を逃しどちらか、ここにそれを追加します。

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

またはここに:あなたは(notifydatasetchanged呼び出すのを忘れて

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

public void cleanUp() { 
    friendsList.clear(); 
    notifyDataSetChanged(); 
} 
関連する問題