简体   繁体   English

无法呈现推文

[英]Can not render tweets

Hi I'm new to Android Studio and I have a code like this:嗨,我是 Android Studio 的新手,我有这样的代码:

HomeFragment.java 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?当我尝试调试它时,它首先转到 getData 方法,但在 getData 的 ref.addValueEventListener(new ValueEventListener()) 方法之后,它然后转到 buildRecyclerView 方法,因此正如预期的那样,它尝试呈现长度为 0 的数组列表。我怎么能防止?

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. onDataChange()是异步的,这意味着它不会等到所有数据都被检索到,而是在检索所有数据之前执行buildRecyclerView()方法,从而解决问题。 You need to add buildRecyclerView() inside onDataChange() and remove it from onCreateView() :您需要添加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