0

データはFirebaseHelperのfetchData()メソッドでフェッチされていますが、実際にはCardViewAdapterの変数petInfoおよびimgURLに格納されていません。これにより、RecyclerViewフラグメントにカードが表示されなくなります。アプリケーションが初期化されると、データセットは0になり、fetchDataを介して実行され、データセットはアイテムのサイズですが、petInfoとimgURLはnullのままになります。FirebaseのデータがRecyclerViewに表示されない

FirebaseHelper:

public class FirebaseHelper { 
    private DatabaseReference mDatabase; 


    Boolean saved = null; 
    ArrayList<AnimalType> animal = new ArrayList<>(); 

    public FirebaseHelper(DatabaseReference mDatabase) { 
     this.mDatabase = mDatabase; 
    } 

    //Save 
    public Boolean save (AnimalType animalType){ 
     if (animalType==null){ 
      saved = false; 
     } 
     else{ 
      try{ 
       mDatabase.child("AnimalType").push().setValue(animalType); 
       saved=true; 
      }catch (DatabaseException e){ 
       e.printStackTrace(); 
       saved=false; 
      } 
     } 
     return saved; 
    } 

    //Read 
    public ArrayList<AnimalType> retrieve(){ 
     mDatabase.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       fetchData(dataSnapshot); 
       Log.i(TAG, "onChildAdded"); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       fetchData(dataSnapshot); 
       Log.i(TAG, "onChildChanged"); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     return animal; 
    } 

    private void fetchData (DataSnapshot dataSnapshot){ 
     animal.clear(); 
     for (DataSnapshot ds : dataSnapshot.getChildren()){ 
      AnimalType animalType = new AnimalType(); 
      animalType.setPetInfo(ds.getValue(AnimalType.class).getPetInfo()); 
      animalType.setImgURL(ds.getValue(AnimalType.class).getImgURL()); 
      animal.add(animalType); 
     } 
    } 

} 

アダプタ:

public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.ViewHolder> { 

    Context mContext; 
    private List<AnimalType> mAnimalData = new ArrayList<>(); 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView petInfo; 
     public ImageView imgURL; 
     public ViewHolder(View view){ 
      super(view); 
      imgURL = (ImageView) view.findViewById(R.id.pet_image); 
      petInfo = (TextView) view.findViewById(R.id.pet_description); 
     } 
    } 

    //constructor 
    public CardViewAdapter(Context mContext, List<AnimalType> mAnimalData){ 
     this.mAnimalData = mAnimalData; 
    } 

    //create new views 
    @Override 
    public CardViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false); 
     ViewHolder viewHolder = new ViewHolder(itemView); 

     mContext = parent.getContext(); 

     return viewHolder; 
    } 

    //replace contents of view 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position){ 
     holder.petInfo.setText(mAnimalData.get(position).getPetInfo()); 
     PicassoClient.downloadImage(mContext,mAnimalData.get(position).getImgURL(), holder.imgURL); 


    } 

    //return size of dataset 
    public int getItemCount(){ 
     return mAnimalData.size(); 
    } 
} 

フラグメント:

public class DogFragment extends Fragment { 
    public static final String ARG_PAGE = "ARG_PAGE"; 

    private int mPage; 

    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mCardAdapter; 
    private RecyclerView.LayoutManager mCardLayoutManager; 

    DatabaseReference mDatabaseReference; 
    FirebaseHelper helper; 


    public static DogFragment newInstance(int page) { 
     DogFragment dogFragment = new DogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, page); 
     dogFragment.setArguments(args); 
     return dogFragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPage = getArguments().getInt(ARG_PAGE); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.fragment_dog, container, false); 

     //cardview 
     mRecyclerView = (RecyclerView)rootView.findViewById(R.id.card_view); 

     //setup firebase 
     mDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
     helper= new FirebaseHelper(mDatabaseReference); 

     //create adapter class 
     //mCardAdapter = new CardViewAdapter(mAimalTypeList); 
     mCardAdapter = new CardViewAdapter(getActivity().getApplicationContext(), helper.retrieve()); 
     mRecyclerView.setAdapter(mCardAdapter); 

     //add linear layout manager 
     mCardLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mCardLayoutManager); 

     //preparePetData(); 

     return rootView; 
    } 
} 

ピカソ:

答えて

1
public class PicassoClient { 

    public static void downloadImage(Context context, String url, ImageView img){ 
     if(url != null && url.length()>0){ 
      Picasso.with(context).load(url).placeholder(R.drawable.placeholder).into(img); 
     } 
     else { 
      Picasso.with(context).load(R.drawable.placeholder).into(img); 
     } 
    } 
} 

helper.retrieve()へのあなたの呼び出しはmDatabase.addChildEventListenerに戻りますが、その結果は非同期的に戻ってきます。その間にそのメソッドから空リストを返しています(デフォルト値はanimal)。結果が返ってくると、アダプタを更新する必要があります(fetchData(dataSnapshot);を呼び出した後)

+0

ありがとうございました。私は比較的新しいアンドロイドプログラミングです。結果が戻ってくると、実際にデータが入力されるようにアダプタを更新するにはどうしたらいいですか? – DessertsAndStuff

+0

これを行うにはいくつかの方法があります.1つの方法は、結果を得た後に呼び出すアダプタに 'update(List animalData)'メソッドを追加することです( 'notifyDataSetChanged'その方法で)。 –

+0

ありがとう!私がやったことは、fetchDataを動かしてメインの断片に取り込むことです。そうすれば、notifyDataSetchangedを簡単に追加できます – DessertsAndStuff

関連する問題