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.