0

數據正在FirebaseHelper的fetchData()方法中獲取,但實際上並未存儲在CardViewAdapter的變量petInfo和imgURL中。這會導致RecyclerView片段中不顯示卡片。當應用程序初始化時,數據集爲0,貫穿fetchData,數據集是項目的大小,但將petInfo和imgURL留空。來自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; 
    } 
} 

畢加索:

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

回答

1

您撥打helper.retrieve()正在啓動mDatabase.addChildEventListener,其結果將異步返回....同時您將從該方法返回空列表(默認值爲animal)。當結果返回時,您需要更新適配器(在調用fetchData(dataSnapshot);後)

+0

謝謝,我想到了類似的情況。我對android編程比較陌生。如何更新適配器,以便在結果返回時實際填充數據? – DessertsAndStuff

+0

有幾種方法可以做到這一點....一個選擇是添加像'更新(列表 animalData)'方法到您的適配器,你會得到結果後調用(並調用'notifyDataSetChanged'在那個方法中)。 –

+0

謝謝!我最終做的是移動fetchData並檢索到主要片段,以便我可以輕鬆地添加notifyDataSetchanged – DessertsAndStuff

相關問題