0

Данные извлекаются в методе fetchData() в FirebaseHelper, но на самом деле не хранятся в переменных petInfo и imgURL в CardViewAdapter. Это приводит к тому, что в фрагменте 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; 
    } 
} 

Пикассо:

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

Есть несколько способов сделать это .... одним из вариантов является добавление к вашему адаптеру что-то вроде метода «update (List animalData)»), который вы вызываете после того, как у вас есть результаты (и вызывается 'notifyDataSetChanged' в этом методе). –

+0

Спасибо! То, что я закончил, - это перемещение fetchData и извлечение в основной фрагмент, чтобы я мог легко добавить в notifyDataSetchanged – DessertsAndStuff

Смежные вопросы