Firebase дает нулевое значение после каждого цикла - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть класс Home, в котором данные извлекаются из Firebase с использованием метода getDatafromFirebase(), и когда я регистрирую значения в цикле, он показывает значение, но когда я добавляю его в список и обновляю адаптер, RecyclerView показывает null для всех значений.

public class Home extends Fragment {
    public Home() {}

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    private DatabaseReference reference = FirebaseDatabase.getInstance ().getReference ();
    ArrayList<FirebaseVideoDetials> list;
    FirebaseVideoDetials details;
    RecyclerViewAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view  =inflater.inflate(R.layout.fragment_home, container, false);
        RelativeLayout without = view.findViewById(R.id.withoutInternet);
        RelativeLayout mainLayout = view.findViewById(R.id.mainLayout);
        recyclerView = view.findViewById(R.id.recyclerView);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),LinearLayoutManager.HORIZONTAL));
        details = new FirebaseVideoDetials();
        list = new ArrayList<FirebaseVideoDetials>();
        getDatafromFirebase();
        adapter = new RecyclerViewAdapter(getActivity(), list);
        recyclerView.setAdapter(adapter);
        if(!Internetcheck.checkConnection(getActivity())){
            without.setVisibility(View.VISIBLE);
            mainLayout.setVisibility(View.INVISIBLE);
        }else{
            without.setVisibility(View.INVISIBLE);
            mainLayout.setVisibility(View.VISIBLE);
        }
        return view;
    }

    public void getDatafromFirebase(){
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot Videoreference = dataSnapshot.child("Videos");
                for (DataSnapshot videoschild : Videoreference.getChildren()){
                    DataSnapshot description = videoschild.child("Description");
                    DataSnapshot duration = videoschild.child("Duration");
                    DataSnapshot title = videoschild.child("Title");
                    DataSnapshot thumbnail = videoschild.child("Thumbnail");
                    details.setDescription(String.valueOf(description.getValue()));
                    details.setDuration(String.valueOf(duration.getValue()));
                    details.setTitle(String.valueOf(title.getValue()));
                    details.setThumbnail(String.valueOf(thumbnail.getValue()));
                    Log.e("details",details.description);
                    list.add(details);
                }
                Log.e("Size",list.get(0).description);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Вы должны сначала инициализировать адаптер перед вызовом adapter.notifyDataSetChanged

adapter = new RecyclerViewAdapter(getActivity(), list);
getDatafromFirebase();
0 голосов
/ 25 сентября 2018

Я решил это, вызвав функцию добавления Listview в отдельной функции:

public void getDatafromFirebase(){
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                list.clear();
                DataSnapshot Videoreference = dataSnapshot.child("Videos");
                for (DataSnapshot videoschild : Videoreference.getChildren()){
                    DataSnapshot description = videoschild.child("Description");
                    DataSnapshot duration = videoschild.child("Duration");
                    DataSnapshot title = videoschild.child("Title");
                    DataSnapshot thumbnail = videoschild.child("Thumbnail");
                    DataSnapshot date = videoschild.child("Date");
                    DataSnapshot time = videoschild.child("Time");
                    updatelist(description.getValue(String.class),
                            title.getValue(String.class),
                            String.valueOf(duration.getValue()),
                            thumbnail.getValue(String.class),
                            String.valueOf(date.getValue()),
                            String.valueOf(time.getValue()));
                }
                adapter.notifyDataSetChanged();
                progressbar.setVisibility(View.GONE);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void updatelist(String desc,String title,String duration,String thumbnail,String Date,String time){
        FirebaseVideoDetials details = new FirebaseVideoDetials();
        details.setDescription(desc);
        details.setDuration(duration);
        details.setTitle(title);
        details.setThumbnail(thumbnail);
        details.setTime(time);
        details.setDate(Date);
        list.add(details);
    }
0 голосов
/ 10 сентября 2018

Чтобы решить эту проблему, переместите следующие строки кода:

adapter = new RecyclerViewAdapter(getActivity(), list);
recyclerView.setAdapter(adapter);

В вашем методе onDataChange() сразу после:

Log.e("Size",list.get(0).description);

И прокомментируйте следующую строку кода, потому чтоне требуется:

//adapter.notifyDataSetChanged();

Чтобы заставить его работать, вы должны инициализировать и установить адаптер внутри обратного вызова, в противном случае он всегда будет null из-за асинхронного поведения этого метода.Для этого я рекомендую посмотреть мой ответ из этой записи .Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...