簡體   English   中英

無法呈現推文

[英]Can not render tweets

嗨,我是 Android Studio 的新手,我有這樣的代碼:

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

問題是這個程序沒有呈現我從數據庫收集的推文。 當我嘗試調試它時,它首先轉到 getData 方法,但在 getData 的 ref.addValueEventListener(new ValueEventListener()) 方法之后,它然后轉到 buildRecyclerView 方法,因此正如預期的那樣,它嘗試呈現長度為 0 的數組列表。我怎么能防止?

onDataChange()是異步的,這意味着它不會等到所有數據都被檢索到,而是在檢索所有數據之前執行buildRecyclerView()方法,從而解決問題。 您需要添加buildRecyclerView()onDataChange()從並將其取出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) {

            }
        });
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM