简体   繁体   中英

Can not render tweets

Hi I'm new to Android Studio and I have a code like this:

HomeFragment.java

package fragments;

import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import com.example.asuss.myapplication.R;
import com.firebase.client.Firebase;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

import adapters.TweetAdapter;
import models.Tweet;

public class HomeFragment extends Fragment {

    private ArrayList<Tweet> tweets = new ArrayList<Tweet>();
    private RecyclerView mRecyclerView;
    private TweetAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private OnFragmentInteractionListener mListener;
    private View view;

    public interface OnFragmentInteractionListener{
        void onFragmentInteraction(Uri uri);
    }
    public HomeFragment(){

    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.home_fragment, container, false);
        //loadTweets();
        getData();
        buildRecyclerView();
        return view;
    }

    private void getData() {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference ref = firebaseDatabase.getReference().child("Tweets");
        final DatabaseReference ref2 = firebaseDatabase.getReference().child("Users");

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()) {
                    for (final DataSnapshot ds : dataSnapshot.getChildren()) {
                        System.out.println("Selam" + ds.toString());
                        if (ds.child("authorId") != null) {
                            final String authorID = ds.child("authorId").getValue().toString();
                            final String id = ds.child("id").getValue().toString();
                            final String content = ds.child("content").getValue().toString();
                            final int likeNumber = Integer.parseInt(ds.child("likeNumber").getValue().toString());
                            final boolean isActive = Boolean.parseBoolean(ds.child("isActive").getValue().toString());

                            ref2.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshotID) {
                                    if (dataSnapshotID.exists()) {
                                        for (DataSnapshot ds2 : dataSnapshotID.getChildren()) {
                                            if (ds2.child("id").getValue().toString().equals(authorID)) {
                                                System.out.println("AuthorID: " + authorID + " İsim: " + ds2.child("username").getValue().toString());
                                                tweets.add(new Tweet(id, R.drawable.ic_adb_black_24dp, ds2.child("username").getValue().toString(),
                                                        content, likeNumber, isActive));
                                            }
                                        }
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseErrorID) {

                                }
                            });
                        }
                    }
                }
                else{
                    Log.i("Database: ","Fail");
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void addTweet() {
        //String tweetContent = editText.getText().toString();
        //tweets.add(new Tweet(tweets.size(), R.drawable.ic_adb_black_24dp, "yarenska", tweetContent, 0));

        // notifyDataSetChanged de çağırılabilir ama animasyonlu olmasını istersek
        // notifyItemInserted çağrılır.
        //mAdapter.notifyItemInserted(tweets.size()-1);

    }

    private void buildRecyclerView() {
        Log.i("Hello","Hello");
        mRecyclerView = view.findViewById(R.id.recyclerView);
        //mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getContext());
        mAdapter = new TweetAdapter(tweets);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new TweetAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Log.i("onItemClicked","Hello" + position);
            }
        });
    }

    private void loadTweets() {
        //tweets.add(new Tweet(1, R.drawable.ic_adb_black_24dp, "yarenska", "Çok güzel bir gün", 2));
        //tweets.add(new Tweet(2, R.drawable.ic_adb_black_24dp, "aligunes73", "Yaşasın", 0));
        //tweets.add(new Tweet(3, R.drawable.ic_adb_black_24dp, "jally_jam", "Matematikten 100 almışım.", 1));
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }
    //Fragment ilk oluştuğu zaman çağrılır.

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}

The problem is this program doesn't render the tweets I gathered from database. When I try to debug it first goes to getData method but just after ref.addValueEventListener(new ValueEventListener()) method of getData, it then goes buildRecyclerView method, so as expected it tries to render an array list of length 0. How can I prevent that?

onDataChange() is asychronous which means it wont wait until all the data is retrieved, instead it will execute the method buildRecyclerView() before retrieving all the data, therefore to solve the problem. You need to add buildRecyclerView() inside onDataChange() and remove it from onCreateView() :

private void getData() {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference ref = firebaseDatabase.getReference().child("Tweets");
        final DatabaseReference ref2 = firebaseDatabase.getReference().child("Users");

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()) {
                    for (final DataSnapshot ds : dataSnapshot.getChildren()) {
                        System.out.println("Selam" + ds.toString());
                        if (ds.child("authorId") != null) {
                            final String authorID = ds.child("authorId").getValue().toString();
                            final String id = ds.child("id").getValue().toString();
                            final String content = ds.child("content").getValue().toString();
                            final int likeNumber = Integer.parseInt(ds.child("likeNumber").getValue().toString());
                            final boolean isActive = Boolean.parseBoolean(ds.child("isActive").getValue().toString());

                            ref2.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshotID) {
                                    if (dataSnapshotID.exists()) {
                                        for (DataSnapshot ds2 : dataSnapshotID.getChildren()) {
                                            if (ds2.child("id").getValue().toString().equals(authorID)) {
                                                System.out.println("AuthorID: " + authorID + " İsim: " + ds2.child("username").getValue().toString());
                                                tweets.add(new Tweet(id, R.drawable.ic_adb_black_24dp, ds2.child("username").getValue().toString(),
                                                        content, likeNumber, isActive));
                                                buildRecyclerView(); //add it here

                                            }
                                        }
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseErrorID) {

                                }
                            });
                        }
                    }
                }
                else{
                    Log.i("Database: ","Fail");
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM