2017-09-26 35 views
0

目的的Android - 火力地堡 - 向用戶發送聊天室

允許用戶訪問他們選擇羣聊。一旦用戶點擊羣聊名稱,他們就會進入該羣聊。

數據庫樹

enter image description here

在數據庫中的樹表示,當前登錄用戶將顯示已創建的羣聊名稱的列表。

我有一個管理員帳戶爲用戶創建這些組聊天。

在數據庫中看到的Android,亞洲和歐洲羣組聊天內容不是固定變量。他們是名字。新的羣聊名稱可以是「地球」。

因此,除了由節點本身調用它之外,沒有辦法通過變量調用它。羣聊2.應用

截圖

  1. 列表中輸入一個羣聊

image2image3

流活動

  1. GroupFragment ---> ChAT活性

  2. GroupFragment < --- ChAT活性

應用的流

用戶---> LoginActivity ---> UserActivity ---> GroupFrag ---> GroupChatActivity

在(GroupFrag ---> GroupChatActivity)用戶必須選擇一個羣聊na我GroupFrag內進入GroupChatActivity

用戶必須在GroupFrag內選擇一個羣聊名稱進入GroupChatActivity

說明

  1. 的用戶將能夠選擇一個羣聊名稱(來自GroupFragment)並且該應用程序將使用戶進入羣聊自身(進入聊天活動)。用戶將能夠回到GroupFragment並選擇另一個想要的組。

(羣聊名稱不固定 - 他們是不是可以從被稱爲節點)

問題

  1. 我無法選擇羣聊名字在片段中被提示後,然後將我帶到羣組聊天。

組片段

@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) { 
      } 
     }); 
    } 

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); 

     } 

附加評論

  • 在線教程

我在YouTube上觀看了Android Firebase羣聊聊天教程。鏈接是https://www.youtube.com/watch?v=wVCz1a3ogqk。但是它並沒有提供一些我試圖實現的特性/功能。

  • 鏈接的問題

Android - Firebase - Prompting Group Chat Names

未來實現

對於未來的實現,我想發送和檢索信息,並提示它變成了用戶羣聊像真正的羣聊一樣查看。但是,當然,我會把它留給另一個問題。

+0

您的「羣組」是靜態的或動態的 –

+0

我的羣組名稱是動態的。如果我要添加名爲「地球」的羣聊,則會有一個名爲「地球」的羣聊。名稱不是**固定**。我應該添加整個班級的代碼嗎?現在我只添加了重要的。意思是我已經排除了進口,私人等等。我發佈的代碼只是功能。謝謝你回答這個問題= D – Student

+0

只是爲了澄清 - 你有一個listview對應於羣聊節點?在這個例子中,listView有3個值?你想說當用戶點擊listView時,他們的用戶名(一個變量)被附加到羣聊節點上? – Torewin

回答

1

您可以按以下步驟更新您的適配器和viewholder實現:

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); 
     } 
    } 
} 

你也有你的GroupFragment更新該行:

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

這是另一種解決方案,您可以在片段中實現,這樣就可以把意圖演員(從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); 
} 

注意,它處理你的字符串,字符串羣聊數據庫中的條目作爲鍵值對。

+0

謝謝爲你的答案Mehmed !!! = D – Student

+0

你好再次@Mehmed,我必須再次麻煩你的另一個問題,因爲我沒有收到任何答案。鏈接是:stackoverflow.com/questions/46471541/...我希望你能找到該幫我的時間了,謝謝 – Student

0

根據本

  1. 嘗試假設您有不同的UID's
  2. 創建5 user'sFirebaseDatabase在這個步驟中,您從Firebase必須get all user'sonBindViewHolder' you have to do like加入RecyclerView
  3. 顯示它在Recyclerview's adapter class並從創建組時創建的列表中刪除用戶。
  4. 在這個步驟中,您已經搜索firebaseDatabase用戶Uid這是目前logged in,如果在任何Group發現你UID is matched,那麼你需要得到Group-name

竭誠爲您服務

+0

但我不打算提示用戶進入列表視圖來查看它們。本來我是打算是這樣的: ** **流** – Student

+0

流量** 用戶---> LoginActivity ---> UserActivity ---> GroupFrag ---> GroupChatActivity 在(GroupFrag- - > GroupChatActivity) 用戶必須在GroupFrag中選擇一個Group Chat名稱才能進入GroupChatActivity – Student

+0

用戶不能創建我們自己的組,如果不是那麼誰創建'group' –

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

我得到了這個錯誤,無法解析方法'setOnItemClickListener(anonymous android.widget.AdapterView.OnItemClickListener)',我也無法解決'get(position)'請幫助這個 – Student

+0

哦,我的壞,你有一個recyclerView - 讓我更新。 – Torewin

+0

好的,謝謝。哦,Firebase偵聽器?好吧,我會嘗試= D – Student