2015-01-26 2 views
0

채팅 앱 사용자가 사용 가능한 그룹 (listview 그룹)에서 제외 된 목록을 볼 수 있으며 사용자는 새 그룹을 만들거나 클릭 할 수 있습니다 일부는 사용 가능한 그룹을 끈 다음 메시지 (목록보기 메시지) 작성을 시작합니다. 함수 CreateNewMessage와 CreateNewGroup이 firebase에 정보를 정확하게 푸시 위의 시나리오가 작동합니다. 사용자가 listview에서 GroupFragment로 메시지를 역방향으로 탐색 (popBackStack()) 할 때 문제가 발생합니다. 여기서 사용자는 사용 가능한 그룹에서 목록을 제시해야하지만 listview는 비어 있어야합니다. ReadGroupData() 함수는 이미 작성된 그룹을 firebase에서 읽지 않고 group listview 그룹에 삽입합니다. 어떻게해야할까요?Android에서 popBackStack()을 사용하면 Firebase 데이터로 안드로이드 목록보기가 업데이트되지 않습니다.

GroupFragment :

public void ReadGroupData() { 
    Firebase firebaserootRef = new Firebase("https://000.firebaseio.com"); 
    firebaserootRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot snapshot, String s) { 
      if (snapshot.getValue() != null) { 
       Group newGroup = new  Group((String)snapshot.child("name").getValue(),    
       (String) snapshot.child("id").getValue()); 

       if(!groupKeyValues.contains(newGroup.GetId())) { 
        groupKeyValues.add(newGroup.GetId()); 

        AddToLstViewGroup(newGroup); 
        System.out.println("Read group data from firebase and 
        inserted in listView"); 
       } 
      } 
     } 
    }); 
} 

public void AddToLstViewGroup(Group newGroup) { 
    groupNameList.add(newGroup); 

    if(groupAdapter == null) { 
     groupAdapter = new GroupAdapter(getActivity(), groupNameList); 
    } 

    if (lstViewGroup == null) { 
     lstViewGroup = (ListView) getView(). 
     findViewById(R.id.listView_group); 
    } 

    lstViewGroup.setOnItemClickListener(onItemClickListener); 
    lstViewGroup.setOnItemLongClickListener(onItemLongClickListener); 

    groupAdapter.notifyDataSetChanged(); 
    lstViewGroup.setAdapter(groupAdapter); 
} 

ChatFragment :

 public void ReadChatMessages(Firebase firebaseRootRef) { 
     firebaseRootRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot snapshot, String s) { 
      if (snapshot.child(GetGroupId()).child("messages"). 
       getChildren() != null) { 
       for (DataSnapshot c : 

      snapshot.child(GetGroupId()).child("messages").getChildren()) { 
        String key = c.getKey(); 

        Message newMessage = new Message(); 
        newMessage.SetFrom((String) c.child("from").getValue()); 
        newMessage.SetMsg((String)  

        c.child("message").getValue()); 
        newMessage.SetTime((String) c.child("time").getValue()); 
        newMessage.SetId((String) c.child("id").getValue()); 

        if ((!msgKeyValues.contains(key)) ||  
         newMessage.GetFrom() != "") { 
         msgKeyValues.add(key); 

         AddToLstViewChat(newMessage); 

         //Automatic scrolls to last line in listView. 
         lstViewChat.setSelection(chatAdapter.getCount() -1); 
        } 
       } 
      } 
     } 

    public void AddToLstViewChat(Message newMessage) { 
    chatMsgList.add(newMessage); 

    if (chatAdapter == null) { 
     chatAdapter = new ChatAdapter(getActivity(), chatMsgList); 
    } 

    if(IsMsgFromMe(newMessage)) { 
     lstViewChat = (ListView) 

    getView().findViewById(R.id.listView_chat_message_me); 
    } else { 
     lstViewChat = 

    (ListView)getView().findViewById(R.id.listView_chat_message_others); 
    } 

    chatAdapter.notifyDataSetChanged(); 
    lstViewChat.setAdapter(chatAdapter); 
} 

ChatActivity : 링크의 모든 코드를 클릭하십시오

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
    } else { 
     finish(); 
    } 
} 

"http://pastebin.com/97nR68Rm"

솔루션!

카토는 인내와 협조에 감사드립니다. 나는 이제 문제에 대한 해결책을 발견했다. 내 onCreateView 메서드에서 End (반환 전)에 ReadGroupData() 및 ReadChatMessages()를 호출합니다. 카토가 지적한대로 onCreate()가 popBackStack()에 호출되지 않음 AddToLStViewGroup에서 lstViewGroup의 if 문이 삭제되므로 listView를 항상 설정합니다. 그렇지 않으면 올바른보기를 찾지 못했음을 알리는 예외가 발생합니다.

이 라인 삭제 :

if (lstViewGroup == null) { 
     lstViewGroup = (ListView)getView().findViewById(R.id.listView_group);   
} 

을 그리고로 대체 :

ListView lstViewGroup=(ListView)getView().findViewById(R.id.listView_group); 
+0

여기서 범위를 좁힐 수 있습니까? 이것이 어떤 부분입니까? 여기에 주어진 문맥은 다음과 같은 말을하는 것 같습니다. 디버깅에 도움이 필요한 응용 프로그램입니다. 의도가 아니라고 확신합니다. 정확히 하나의 질문을 선택하고 [mcve 만들기] (http : // stackoverflow.co.kr/help/mcve) – Kato

+0

귀하의 회신과 피드백을 미리 작성하여 문제의 질문을 업데이트했습니다. 내가 충분히 좁혀지기를 바란다. 아직도 불분명하다면 알려줘. – user2407226

+0

좋아 보인다. 그러나 "올바르게 업데이트되지 않음"은 문제를 정확하게 설명하지 않습니다. 컨텍스트가 없다는 것을 명심하십시오. 앱을 본 적이 없으며 여기에 게시 한 내용 이외에도 다른 내용이 없습니다. 따라서 우리는 "올바르게 업데이트되지 않습니다"코드 스 니펫을 보게됩니다. 그게 무슨 뜻인지 정말로 알아. – Kato

답변

0

카토 당신의 인내와 도움을 주셔서 감사합니다. 나는 이제 문제에 대한 해결책을 발견했다. 내 onCreateView 메소드에서 (반환 전에) ReadGroupData()ReadChatMessages()을 끝에 호출합니다. 카토가 지적한대로 이 호출되지 않습니다. popBackStack()if에 대한 설명이 삭제되었으므로 이제는 항상 listView를 설정합니다. 그렇지 않으면 올바른보기를 찾지 못해 예외가 발생합니다.

는 명확히하기 :

내가이 줄 삭제 :

if (lstViewGroup == null) { 
     lstViewGroup = (ListView)getView().findViewById(R.id.listView_group);   
} 

을 그리고 그것을 대체 :. (원래 아스 커는 질문의 일환으로 대답을 게시

ListView lstViewGroup =(ListView)getView().findViewById(R.id.listView_group); 

I ' 여기서 가정용으로 복사합니다.)

관련 문제