2017-09-26 1 views
0

ButAndroid - Firebase - Envoyer utilisateurs de Chat Room

Permettre aux utilisateurs d'accéder à leur groupe sélectionné chat. Une fois que l'utilisateur a cliqué sur le nom de la conversation de groupe, il sera entré dans ce groupe de conversation.

Database Arbre

enter image description here

Comme le montre la base de données Arbre, l'enregisté utilisateur sera affiché une liste de noms de conversation de groupe qui ont été créés.

J'ai un compte administrateur pour créer ces groupes de discussion pour les utilisateurs.

Les conversations de groupe Android, Asie et Europe qui sont visibles dans la base de données NE SONT PAS des variables fixes. Ce sont des noms. Un nouveau nom de conversation de groupe pourrait être "Terre".

Par conséquent, il n'y a aucun moyen de l'appeler par une variable autre que l'appeler par le nœud lui-même.

Capture d'écran d'application

  1. Liste du groupe 2. Causeries Saisie d'un groupe de conversation

image2image3

flux des activités

  1. GroupFragment ---> Causerie Activité

  2. GroupFragment < --- Activité pour chatter

flux d'application

Utilisateur ---> LoginActivity ---> UserActivity ---> GroupFrag ---> GroupChatActivity

Au (GroupFrag ---> GroupChatActivity) L'utilisateur doit sélectionner un Group Chat na moi dans le GroupFrag pour entrer dans le GroupChatActivity

L'utilisateur doit sélectionner un nom de groupe chat dans le GroupFrag pour entrer dans le GroupChatActivity

Description de

  1. Les utilisateurs seront en mesure de sélectionner un groupe de conversation name (à partir de GroupFragment) et l'application va amener l'utilisateur dans le groupe de discussion lui-même (dans l'activité de chat). L'utilisateur pourra revenir à GroupFragment et sélectionner un autre groupe désiré.

(noms de conversation de groupe sont pas figées - Ils ne sont pas un nœud qui peut être appelé à partir)

Problème

  1. Je ne peux pas sélectionner le groupe de conversation noms après qu'il a été rapide dans le Fragment, ce qui m'amènera alors à la conversation de groupe.

Groupe Fragment

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


     class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.MyHolder> { 

      ArrayList<String> list; 

      public GroupAdapter(ArrayList<String> list) { 
       this.list = list; 
      } 


      @Override 
      public GroupAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_groups, parent, false); 

       return new MyHolder(view); 
      } 

      @Override 
      public void onBindViewHolder(MyHolder holder, int position) { 
       holder.setText(list.get(position)); 
      } 

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

      class MyHolder extends RecyclerView.ViewHolder { 
       TextView nameTextView; 

       public MyHolder(View itemView) { 
        super(itemView); 
        nameTextView = itemView.findViewById(R.id.groupChatNameTxt); 
       } 

       public void setText(String groupName) { 
        nameTextView.setText(groupName); 
       } 
      } 
     } 

     jGroupsDatabase.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       ArrayList<String> groupChatNames = new ArrayList<>(); 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 
        groupChatNames.add(child.getKey()); 
       } 
       GroupAdapter adapter = new GroupAdapter(groupChatNames); 
       jGroupChatList.setAdapter(adapter); 

       //I'm not sure where to write a code for userID 
       //final String usersID = getRef(position).getKey(); 
// When the user clicks on one of the group chat names, he/she will be sent to the Chat Activity 

       jGroupChatList.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class); 
         intentUserProfile.putExtra("groupChatName",groupName); 
         intentUserProfile.putExtra("neighbourhood", neighbourhood); 
         intentUserProfile.putExtra("usersName", usersName); 
         intentUserProfile.putExtra("usersID", usersID); 
         startActivity(intentUserProfile); 
        } 
       }); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
     }); 
    } 

Activité Chat

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 

     jGroupChatName = getIntent().getExtras().get("groupChatName").toString(); 
     jUserID = getIntent().getExtras().get("usersID").toString(); 
     jUserName = getIntent().getExtras().get("usersName").toString(); 
     jUserNeighbourhood = getIntent().getExtras().get("neighbourhood").toString(); 

     jChatRoot = FirebaseDatabase.getInstance().getReference().child(jGroupChatName); 

     jChatToolbar = (Toolbar) findViewById(R.id.allUSersToolBar); 
     setSupportActionBar(jChatToolbar); 
     getSupportActionBar().setTitle(jGroupChatName); // Show the name of the selected group name 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     } 

Commentaires supplémentaires

  • Didacticiel en ligne

J'ai regardé un didacticiel de conversation de groupe Android Firebase sur youtube. Le lien est https://www.youtube.com/watch?v=wVCz1a3ogqk. Mais il ne fournit pas les fonctionnalités/fonctions que je suis en train d'implémenter.

  • Lié Question

Android - Firebase - Prompting Group Chat Names

Future Implémentations

Pour les implémentations futures, je voudrais envoyer et récupérer les messages et invite dans le chat de groupe pour les utilisateurs pour voir comme un vrai chat de groupe. Mais bien sûr, je vais laisser cela pour une autre question.

+0

Vos 'groups' sont statiques ou dynamiques –

+0

Mes noms de groupe sont dynamiques. Si je devais ajouter à une discussion de groupe appelée "Terre", il y aura alors une discussion de groupe appelée "Terre". Les noms ne sont pas ** fixes **. Dois-je ajouter le code entier pour le cours? En ce moment j'ai seulement ajouté dans les importants. Ce qui signifie que j'ai exclu les importations, les fichiers privés, etc. Les codes que j'ai publiés ne sont que les fonctions. Et merci d'avoir répondu à cette question = D – Student

+0

Juste pour clarifier - vous avez un listView qui correspond au noeud Group Chat? Dans l'exemple, listView a 3 valeurs? Et vous voulez dire quand un utilisateur clique sur la liste puis son nom d'utilisateur (une variable) est ajouté au noeud de conversation de groupe? – Torewin

Répondre

1

Vous pouvez mettre à jour votre carte et la mise en œuvre de viewholder comme suit:

public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder> { 

    Context context; 
    ArrayList<String> list; 

    public Adapter(Context context, ArrayList<String> list) { 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public Adapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_groups, parent, false); 
     MyHolder holder = new MyHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyHolder holder, int position) { 
     holder.setText(list.get(position)); 
    } 

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

    class MyHolder extends RecyclerView.ViewHolder { 
     TextView nameTextView; 
     View.OnClickListener onClickListener = new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String groupName = list.get(getAdapterPosition()); 
       Intent intentUserProfile = new Intent(context, MainActivity.class); 
       intentUserProfile.putExtra("groupChatName", groupName); 
       // If fixed, you should pass these values to adapter's constructor 
       // intentUserProfile.putExtra("neighbourhood", neighbourhood); 
       // intentUserProfile.putExtra("usersName", usersName); 
       // intentUserProfile.putExtra("usersID", usersID); 
       context.startActivity(intentUserProfile); 
      } 
     }; 

     public MyHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(onClickListener); 
      nameTextView = (TextView) itemView.findViewById(R.id.groupChatNameTxt); 
     } 

     public void setText(String groupName) { 
      nameTextView.setText(groupName); 
     } 
    } 
} 

Vous devez également mettre à jour cette ligne dans votre GroupFragment:

GroupAdapter adapter = new GroupAdapter(getActivity(), groupChatNames); 

Ceci est une autre solution que vous pouvez mettre en œuvre dans votre fragment afin que vous puissiez mettre extras dans l'intention (réellement modifiés de votre former question):

@Override 
public void onStart() { 
    super.onStart(); 
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
    DatabaseReference groupChatsRef = rootRef.child("Group Chats"); 
    FirebaseRecyclerAdapter<String, GroupChatViewHolder> chatAdapter = new FirebaseRecyclerAdapter<String, GroupChatViewHolder>(
      String.class, 
      R.layout.layout_groups, 
      GroupChatViewHolder.class, 
      groupChatsRef) { 
     protected void populateViewHolder(GroupChatViewHolder viewHolder, String model, int position) { 
      final String groupChatName = this.getRef(position).getKey(); 
      viewHolder.setName(groupChatName); 
      viewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class); 
        intentUserProfile.putExtra("groupChatName", groupChatName); 
        intentUserProfile.putExtra("neighbourhood", neighbourhood); 
        intentUserProfile.putExtra("usersName", usersName); 
        intentUserProfile.putExtra("usersID", usersID); 
        startActivity(intentUserProfile); 
       } 
      }); 
     } 
    }; 
    jGroupChatList.setAdapter(chatAdapter); 
} 

Notez qu'il gère votre groupe chaîne-chaîne dans le chat entrées dans votre base de données en tant que paires clé-valeur.

+0

Merci pour votre réponse Mehmed !!! = D – Student

+0

Bonjour à nouveau @Mehmed, je dois vous déranger encore une fois pour une autre question car je ne reçois pas de réponses.Le lien est: stackoverflow.com/questions/46471541/... J'espère que vous pouvez trouver le temps de m'aider, merci – Student

0

Essayez selon cette

  1. Supposons que vous avez créé 5 user's dans FirebaseDatabase avec différents UID's
  2. Dans cette étape, vous devez get all user's de Firebase et l'afficher dans RecyclerView
  3. En Recyclerview's adapter class dans onBindViewHolder' you have to do like add et supprimer les utilisateurs de la liste que vous avez générée au moment de la création du groupe.
  4. Dans cette étape, vous avez à la recherche de firebaseDatabaseUid utilisateur qui est actuellement logged in et si votre UID is matched trouvé dans tous les Group alors vous avez besoin pour obtenir le Group-name.

Heureux de vous aider à

+0

Mais je n'ai pas l'intention d'inviter les utilisateurs dans une vue de liste pour les voir. Ce que je veux est la suivante: ** Débit ** – Student

+0

** Débit ** Utilisateur ---> LoginActivity ---> UserActivity ---> GroupFrag ---> GroupChatActivity Au (GroupFrag- -> GroupChatActivity) L'utilisateur doit sélectionner un nom de Group Group dans GroupFrag pour entrer dans GroupChatActivity – Student

+0

L'utilisateur ne peut pas créer son propre groupe sinon créer un groupe –

1
public class group_name_list_adapter extends RecyclerView.Adapter<group_name_list_adapter.ViewHolder> { 

     private List< group_name_list> listItems; 
     private Context context; 
     OnItemClickListener onItemClickListener; 

     public group_name_list_adapter(List<group_name_list> listItems, Context context) { 
      this.listItems = listItems; 
      this.context = context; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.group_name_list, parent, false); 
      return new ViewHolder(v); 
     } 

     @Override 
     public void onBindViewHolder(ViewHolder holder, final int position) { 
      group_name_list listItem = listItems.get(position); 

      holder.txtTitle.setText(listItem.getTxtTitle()); 
      holder.txtTitle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onItemClickListener.onGroupNameClick(position); 
       } 
      }); 
     } 

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

     public class ViewHolder extends RecyclerView.ViewHolder { 

      public TextView txtTitle; 

      public ViewHolder(View itemView) { 
       super(itemView); 
       txtTitle = (TextView) itemView.findViewById(R.id.txtTitle); 
      } 
     } 
     public void setOnItemClickListener(OnItemClickListener onItemClickListener){ 
      this.onItemClickListener = onItemClickListener; 
     } 

     public interface OnItemClickListener{ 
      void onGroupNameClick(int position); 
     } 
    } 



    public class group_name_list { 

     private String txtTitle; 

     public group_name_list(String txtTitle) { 
      this.txtTitle = txtTitle; 
     } 

     public String getTxtTitle() { 
      return txtTitle; 
     } 
    } 



    public class ChatActivity implements group_name_list_adapter.OnItemClickListener 

    private RecyclerView recyclerGroupName; 
    private group_name_list_adapter groupNameAdapter; 
    private List<group_name_list> group_name_List; 
    private List<String> groupNameKeyList; //This is optional – this is used if you wanted the group chats to have the same name instead of overwriting the groupchat when creating. 

    Inside your Firebase call: 

    group_name_List.removeAll(group_name_List t); 
    groupNameKeyList.removeAll(groupNameKeyList); 
    //Depending on your firebase reference. This could just be dataSnapshot.getChildren() 
    for (DataSnapshot child : dataSnapshot.child("Group Chats").getChildren()){ 


     if (!child.getKey().equals(null)){ 
      groupNameKeyList.add(child.getKey().toString()); //Again this is optional 
     } 

     group_name_list newGroupList = child.getValue(); 
     ); 
     groupNameList.add(newGroupList); 
    } 
    recyclerGroupName.setAdapter(groupNameAdapter); 

    gLayoutAttribute = new GridLayoutManager(getActivity(), 1); 
    recyclerGroupName = (RecyclerView) rootView.findViewById(R.id.recyclerGroupName); 
    recyclerGroupName.setHasFixedSize(true); 
    recyclerGroupName.setLayoutManager(new LinearLayoutManager(this.getContext())); 
    recyclerGroupName.setLayoutManager(gLayoutAttribute); 


@Override 
    public void onAttributeClick(int position) { 
     Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class); 
     intentUserProfile.putExtra("groupChatName",groupName); 
     intentUserProfile.putExtra("neighbourhood", neighbourhood); 
     intentUserProfile.putExtra("usersName", usersName); 
     intentUserProfile.putExtra("usersID", usersID); 
     intent.putExtra("name", groupList.get(position).toString()); 
     //intent.putExtra("name", groupListKeyList.get(position).toString()); this is your optional key 
     startActivity(intentUserProfile); 
    } 
+0

J'ai cette erreur, Impossible de résoudre la méthode 'setOnItemClickListener (anonymous android.widget.AdapterView.OnItemClickListener)' et aussi je ne pouvais pas résoudre le 'get (position)' S'il vous plaît aider avec ce – Student

+0

Oh mon dieu, vous avez un recyclerView - let moi mise à jour. – Torewin

+0

D'accord, merci. Oh un auditeur Firebase? Ok je vais essayer ça = D – Student