简体   繁体   English

Recyclerview 第一次没有加载( Firebase )

[英]Recyclerview doesn't load the first time ( Firebase )

When opening the activity the first time no items are loaded, but when opening it through the navDrawer for the second time all items are quickly loaded/displayed:第一次打开活动时没有加载任何项目,但是当第二次通过 navDrawer 打开它时,所有项目都会快速加载/显示:

http://natureprepping.bplaced.net/Error.mp4 http://natureprepping.bplaced.net/Error.mp4

I hope someone else can help me.我希望别人能帮助我。

Main:主要的:

package com.example.lostplacemap;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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 java.util.List;

public class Main extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    DrawerLayout drawer;
    NavigationView navigationView;

    FirebaseAuth auth;
    RecyclerView recyclerViewMain;
    RecyclerView.Adapter adapter;
    ProgressDialog progressDialog;

    DatabaseReference databaseReference, followRef;
    ImageView like;
    List<ImageUploadInfo> list = new ArrayList<>();
    List<String> followingList;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        like = findViewById(R.id.ic_like);
        navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        auth = FirebaseAuth.getInstance();

        recyclerViewMain = findViewById(R.id.recyclerView);

        //recyclerViewMain.setHasFixedSize(true);

        recyclerViewMain.setLayoutManager(new LinearLayoutManager(Main.this));

        progressDialog = new ProgressDialog(Main.this);
        progressDialog.setMessage("Lade Bilder...");
        progressDialog.show();

        followingList = new ArrayList<>();

        adapter = new RecyclerViewAdapter(Main.this, list);
        recyclerViewMain.setAdapter(adapter);

        databaseReference = FirebaseDatabase.getInstance().getReference("All_Image_Uploads_Database");
        followRef = FirebaseDatabase.getInstance().getReference("Follow").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("following");

        //Query SortPosts = databaseReference.orderByChild("counter");


        final FirebaseUser user = auth.getCurrentUser();

        followRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                followingList.clear();
                followingList.add(user.getUid());
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    followingList.add(snapshot.getKey());
                }
            }

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

            }
        });


        databaseReference.orderByChild("counter").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    final ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);

                    for (String id : followingList) {
                        if (imageUploadInfo.getPublisher().equals(id)) {
                            list.add(imageUploadInfo);
                        }
                    }
                    adapter.notifyDataSetChanged();
                }
                progressDialog.dismiss();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(Main.this, "Fehler!", Toast.LENGTH_SHORT).show();
                progressDialog.dismiss();
            }
        });
    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        //here is the main place where we need to work on.
        int id = item.getItemId();
        switch (id) {

            case R.id.nav_home:
                Intent h = new Intent(Main.this, Main.class);
                startActivity(h);
                break;


            case R.id.nav_logout:
                FirebaseAuth.getInstance().signOut();
                Intent f = new Intent(Main.this, Login.class);
                startActivity(f);
                break;

            case R.id.nav_profil:
                Intent e = new Intent(Main.this, Profil.class);
                startActivity(e);
                break;

            case R.id.nav_new:
                Intent d = new Intent(Main.this, New_Marker.class);
                startActivity(d);
                break;

            case R.id.nav_new_post:
                Intent c = new Intent(Main.this, NewPost.class);
                startActivity(c);
                break;

            case R.id.nav_follow:
                Intent b = new Intent(Main.this, FollowActivity.class);
                startActivity(b);
                break;

            case R.id.nav_karten_auswahl:
                Intent a = new Intent(Main.this, KartenAuswahl.class);
                startActivity(a);
                break;

            case R.id.nav_settings:
                Intent aa = new Intent(Main.this, SettingsActivity.class);
                startActivity(aa);
                break;

            case R.id.nav_chat:
                Intent ab = new Intent(Main.this, ChatActivity.class);
                startActivity(ab);
                break;
        }


        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }


}

Adapter:适配器:

package com.example.lostplacemap;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.example.lostplacemap.Model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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.List;


public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private FirebaseAuth fAuth = FirebaseAuth.getInstance();
    private DatabaseReference databaseReference2;

    private Context context;
    private List<ImageUploadInfo> MainImageUploadInfoList;

    RecyclerViewAdapter(Context context, List<ImageUploadInfo> TempList) {
        this.MainImageUploadInfoList = TempList;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_items, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ImageUploadInfo UploadInfo = MainImageUploadInfoList.get(position);

        holder.imageNameTextView.setText(UploadInfo.getImageName());
        holder.publisher.setText(UploadInfo.getPublisherName());
        Glide.with(context).load(UploadInfo.getImageURL()).into(holder.imageView);

        final FirebaseUser user = fAuth.getCurrentUser();

        databaseReference2.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                User user = dataSnapshot.child(UploadInfo.publisher).getValue(User.class);
                Glide.with(context)
                        .load(user.getImageurl())
                        .into(holder.image_profile);
            }

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

            }
        });

        holder.publisher.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openUser(UploadInfo);
            }
        });


        holder.image_profile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openUser(UploadInfo);
            }
        });


        isLiked(UploadInfo.getPostid(), holder.like);
        nrLikes(holder.AnzahlLikes, UploadInfo.getPostid());

        holder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.like.getTag().equals("like")) {
                    FirebaseDatabase.getInstance().getReference().child("Likes").child(UploadInfo.getPostid()).child(user.getUid()).setValue(true);
                } else {
                    FirebaseDatabase.getInstance().getReference().child("Likes").child(UploadInfo.getPostid()).child(user.getUid()).removeValue();
                }
            }
        });

    }

    @Override
    public int getItemCount() {

        return MainImageUploadInfoList.size();
    }

    private void isLiked(String postid, final ImageView imageView) {
        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Likes").child(postid);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                assert firebaseUser != null;
                if (dataSnapshot.child(firebaseUser.getUid()).exists()) {
                    imageView.setImageResource(R.drawable.ic_liked);
                    imageView.setTag("liked");
                } else {
                    imageView.setImageResource(R.drawable.ic_like);
                    imageView.setTag("like");
                }
            }

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

            }
        });


    }

    private void nrLikes(final TextView likes, String postid) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Likes").child(postid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                likes.setText(String.valueOf(dataSnapshot.getChildrenCount()));
            }

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

            }
        });
    }

    private void openUser(ImageUploadInfo uploadInfo) {
        SharedPreferences userS = context.getSharedPreferences("selectedUser",
                Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = userS.edit();
        editor.putString("user", uploadInfo.publisher);
        editor.apply();
        Intent i1 = new Intent(context, UniversalProfil.class);
        context.startActivity(i1);
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView imageNameTextView;
        ImageView like;
        TextView AnzahlLikes;
        TextView publisher;
        ImageView image_profile;


        ViewHolder(View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageView);
            like = itemView.findViewById(R.id.ic_like);
            imageNameTextView = itemView.findViewById(R.id.ImageNameTextView);
            AnzahlLikes = itemView.findViewById(R.id.likeCount);
            publisher = itemView.findViewById(R.id.TextUsername);
            image_profile = itemView.findViewById(R.id.image_profile);

            databaseReference2 = FirebaseDatabase.getInstance().getReference("Users");
        }

    }

}

I have tried to fix it but failed because the error also doesn't occur always.我试图修复它但失败了,因为错误也不总是发生。

Try to put all this code:尝试把所有这些代码:

    databaseReference.orderByChild("counter").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {

            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                final ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);

                for (String id : followingList) {
                    if (imageUploadInfo.getPublisher().equals(id)) {
                        list.add(imageUploadInfo);
                    }
                }
                adapter.notifyDataSetChanged();
            }
            progressDialog.dismiss();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(Main.this, "Fehler!", Toast.LENGTH_SHORT).show();
            progressDialog.dismiss();
        }
    });

Directly under this for loop, in the first query:直接在这个for循环下,在第一个查询中:

........
......... 
followRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

followingList.clear();
followingList.add(user.getUid());

for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
followingList.add(snapshot.getKey());
}
//here paste the code

...........
............

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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