2017-11-05 5 views
0

現在、すべてのリポジトリデータをlistViewに表示するアプリケーションを開発中です。私の断片では、fetchRepoDataという関数を呼び出し、Firebase DBからデータを取り出し、listViewに入れます。Firebaseデータが変更されたときのAndroid Studioのビューの更新

OnCreateView

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.repo_result_tab, container, false); 

     repoListView = (ListView) view.findViewById(R.id.repoList_result); 

     radioGroup = (RadioGroup) view.findViewById(R.id.radio_group); 
     sortByNameRadio = (RadioButton) view.findViewById(R.id.sort_by_name); 
     sortByRelevanceRadio = (RadioButton) view.findViewById(R.id.sort_by_relevance); 

     repoListItems = new ArrayList<>(); 
     repoNameList = new ArrayList<>(); 
     userNameList = new ArrayList<>(); 
     descriptionList = new ArrayList<>(); 

     adapter = new RepoListAdapter(getContext(), repoListItems); 
     repoListView.setAdapter(adapter); 

     Database = FirebaseDatabase.getInstance().getReference(); 
     repoReference = Database.child("Repo Search Results"); 
     ..... 

fetchRepoData

private void fetchRepoData(String profileUserID) { 

    profileUserDatabase = repoReference.child(profileUserID); 

    //DatabaseReference reposReference = profileUserDatabase.child("Repos"); 

    profileUserDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Toast.makeText(getActivity(), "changed", Toast.LENGTH_SHORT).show(); 
      for(DataSnapshot snapshot : dataSnapshot.getChildren()) { 

       repoNameList.add(snapshot.getValue(RepoInfo.class).getRepoName()); 
       userNameList.add(snapshot.getValue(RepoInfo.class).getOwner()); 
       descriptionList.add(snapshot.getValue(RepoInfo.class).getDescription()); 
      } 

      for(int i = 0; i < repoNameList.size(); i++) { 
       repoListItems.add(new RepositoryItem(i, repoNameList.get(i), userNameList.get(i), descriptionList.get(i))); 
      } 
      adapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

私はFirebase内のデータを更新しようとするたびしかし、ListViewコントロールを更新し、同じままされません。トーストメッセージが「変更されました」と表示されますが、リストからアイテムを削除してもビューは変わりません。

私もOnDataChangeの内部

repoListItems.clear(); 

を入れてみましたが、それはうまくいきませんでした。

答えて

0

あなたのための私の助言は、そうするためにFirebase UIを使用することです。

リストビューまたはrecyclerview UIを簡単かつ効率的に更新できます。アダプタに問題があるように思わ

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

+0

ところで、あなたはアイテムを削除したと言いますが、それはリストから削除されませんでした。削除するにはアダプタから削除する必要があります。アイテムを追加したケースのみ管理しました。 –

0

、それはアイテムをリフレッシュされていません。

あなたはここで詳細を見つけることができます。あなたは

public void swapItems(ArrayList<String> repoListItems) { 
      this.repoListItems = itemList; 
      notifyDataSetChanged(); 
     } 

change your code like below: 

    public void onDataChange(DataSnapshot dataSnapshot) { 

     Toast.makeText(getActivity(), "changed", Toast.LENGTH_SHORT).show(); 
     repoNameList.clear(); 
     for(DataSnapshot snapshot : dataSnapshot.getChildren()) { 

        repoNameList.add(snapshot.getValue(RepoInfo.class).getRepoName()); 
        userNameList.add(snapshot.getValue(RepoInfo.class).getOwner()); 
        descriptionList.add(snapshot.getValue(RepoInfo.class).getDescription()); 
       } 

     for(int i = 0; i < repoNameList.size(); i++) { 
      repoListItems.add(new RepositoryItem(i, repoNameList.get(i), userNameList.get(i), descriptionList.get(i))); 
       } 
      adapter.swapItems(repoNameList); 
      } 

注すなわちアダプタ内の関数を書くことができ :私はstackoverflowのから上記を読みましたが、私はここに投稿するためのリンクが見つかりませんでした。

関連する問題