首页 > 解决方案 > 每次我必须改变一些东西来反映

问题描述

在我的聊天应用程序 FriendsFragment 中显示空白。如果我想反映这一点,我已经运行了该应用程序,在我的应用程序中打开“朋友”选项卡,然后在 Android Studio 中即时运行后,它就会反映。如果没有,那么我必须在我的 FriendsFragment 中的任何位置添加 Log 语句,并使用完全打开的 friendsfragmet 选项卡运行 Instant run。

为什么我告诉你添加 Log 语句是必要的,因为我发现了这个错误,每当我在我的 Friends Fragment 上更改某些内容然后运行 ​​Instant run 时,它只会显示 Fragment 部分。而且我每次都必须这样做,否则它不会显示。添加 Log 语句并第二次删除,或更改标签或更改消息,做一些更改,并且必须运行即时运行(那个黄色符号,如助推器)。

注意:我还在做这个事情,我自己观察到这个问题,我也不知道为什么我每次都要改变一些东西来显示这个片段?我也在同一个应用程序中构建了类似的片段,但是没有问题!

朋友片段

package com.jimmytrivedi.lapitchat;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
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.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
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.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import de.hdodenhof.circleimageview.CircleImageView;

public class FriendsFragment extends Fragment {

    private RecyclerView FriendRecyclerView;
    private DatabaseReference databaseReference, UsersDatabaseReference;
    private FirebaseAuth mAuth;
    private String currentUID;
    private View MainView;


    public FriendsFragment() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        MainView = inflater.inflate(R.layout.fragment_friend, container, false);
        FriendRecyclerView = MainView.findViewById(R.id.FriendRecyclerView);
        mAuth = FirebaseAuth.getInstance();

        if (mAuth.getCurrentUser() != null) {
            currentUID = mAuth.getCurrentUser().getUid();
            databaseReference = FirebaseDatabase.getInstance().getReference().child("Friends").child(currentUID);
            databaseReference.keepSynced(true);
            UsersDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
            UsersDatabaseReference.keepSynced(true);
        }

        FriendRecyclerView.setHasFixedSize(true);
        FriendRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
           Log.d("wihddiewd", "Is it going?");
        return MainView;
    }

    @Override
    public void onStart() {
        super.onStart();

        Query query = FirebaseDatabase.                                                                                                                                                                                                                                                                                                         getInstance()
                .getReference()
                .child("Friends")
                .limitToLast(50);

        FirebaseRecyclerOptions<Friends> options = new FirebaseRecyclerOptions.Builder<Friends>()
                .setQuery(query, Friends.class)
                .build();

        final FirebaseRecyclerAdapter<Friends, FriendsViewHolder> FriendsRecyclerViewAdapter = new
                FirebaseRecyclerAdapter<Friends, FriendsViewHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull final FriendsViewHolder holder, int position, @NonNull Friends model) {
                        holder.setDate(model.getDate());

                        final String listUID = getRef(position).getKey();
                        UsersDatabaseReference.child(listUID).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                                final String userName = dataSnapshot.child("Name").getValue().toString();
                                String thumbImage = dataSnapshot.child("thumbImage").getValue().toString();
                                String userOnline = dataSnapshot.child("Online").getValue().toString();

                                holder.setName(userName);
                                holder.setThumbImage(thumbImage, getContext());
                                holder.setUserOnline(userOnline);
                                holder.mView.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        CharSequence options[] = new CharSequence[]{"Open profile", "Send message"};

                                        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                                        builder.setTitle("Select Options");
                                        builder.setItems(options, new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                if (which == 0) {
                                                    Intent intent = new Intent(getContext(), ProfileActivity.class);
                                                    intent.putExtra("userID", listUID);
                                                    startActivity(intent);
                                                }

                                                if (which == 1) {
                                                    Intent intent = new Intent(getContext(), ChatActivity.class);
                                                    intent.putExtra("userID", listUID);
                                                    intent.putExtra("userName", userName);
                                                    startActivity(intent);
                                                }
                                            }
                                        });

                                        builder.show();
                                    }
                                });

                            }

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

                            }

                        });
                    }

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


        FriendRecyclerView.setAdapter(FriendsRecyclerViewAdapter);
        FriendsRecyclerViewAdapter.startListening();

    }

    public static class FriendsViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public FriendsViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setDate(String date) {
            TextView userStatusView = mView.findViewById(R.id.userStatus);
            userStatusView.setText(date);
        }

        public void setName(String name) {
            TextView userNameView = mView.findViewById(R.id.userName);
            userNameView.setText(name);
        }

        public void setThumbImage(String thumbImage, Context context) {
            CircleImageView circleImageView = mView.findViewById(R.id.userImage);
            Picasso.get().load(thumbImage).placeholder(R.drawable.defaultimage)
                    .into(circleImageView);
        }

        public void setUserOnline(String online) {
            ImageView userOnline = mView.findViewById(R.id.online);
            if (online.equals("true")) {
                userOnline.setVisibility(View.VISIBLE);
            } else {
                userOnline.setVisibility(View.INVISIBLE);
            }
        }
    }
}

更新

我知道这是一个奇怪的错误。但基本上,当我打开我的应用程序并在应用程序朋友选项卡(即 FriendsFragment.java)中,它显示为空白。所以我尝试调试我的代码是否有任何错误?但我没有找到。但是在调试时,当我转到移动应用程序中的朋友选项卡并将任何日志语句放入 Android Studio 时(因为当我添加/删除某些内容时,Android Studio 会理解发生了一些更改,然后我运行 Instant run (不是正常运行)然后 FriendFragment 将反映并显示用户列表。

而且我每次都必须这样做,(意味着我必须添加/删除一些东西,考虑对 Android Studio 的更改)然后只有 FriendsFragment 会显示用户列表。即使我没有打开我的朋友选项卡,而是在应用程序中打开其他东西而不是运行(即时运行),这也是行不通的!只有当我只是去朋友选项卡(那个时候它显示为空白,但没关系)并运行即时运行时,它才会反映。

片段朋友.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FriendsFragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/FriendRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.RecyclerView>


</RelativeLayout>

users_single_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/userImage"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_marginBottom="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:src="@drawable/defaultimage" />

    <TextView
        android:id="@+id/userName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/userImage"
        android:layout_marginStart="99dp"
        android:text="Display Name"
        android:textColor="#000000"
        android:textSize="18dp" />

    <TextView
        android:id="@+id/userStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/userName"
        android:layout_below="@+id/userName"
        android:text="User default Status"
        android:textSize="15dp" />

    <ImageView
        android:id="@+id/online"
        android:layout_width="8dp"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/userName"
        android:layout_marginLeft="10dp"
        android:layout_toEndOf="@+id/userName"
        android:visibility="invisible"
        android:src="@drawable/online" />

</RelativeLayout>

另一个片段 ChatFragment,与此类似并且工作得很好)。

聊天片段.java

package com.jimmytrivedi.lapitchat;


import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
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.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import de.hdodenhof.circleimageview.CircleImageView;


public class ChatFragment extends Fragment {

    private RecyclerView ConversationList;
    private DatabaseReference ConversationRef, MessageRef, UserRef;
    private FirebaseAuth mAuth;
    private String currentUID;
    private View MainView;

    public ChatFragment() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        MainView = inflater.inflate(R.layout.fragment_chat, container, false);
        ConversationList = MainView.findViewById(R.id.ConversationList);
        mAuth = FirebaseAuth.getInstance();
        currentUID = mAuth.getCurrentUser().getUid();

        ConversationRef = FirebaseDatabase.getInstance().getReference().child("Chat").child(currentUID);
        ConversationRef.keepSynced(true);

        UserRef = FirebaseDatabase.getInstance().getReference().child("Users");
        UserRef.keepSynced(true);

        MessageRef = FirebaseDatabase.getInstance().getReference().child("Messages").child(currentUID);

        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);

        ConversationList.setHasFixedSize(true);
        ConversationList.setLayoutManager(layoutManager);

        return MainView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Query conversationQuery = ConversationRef.orderByChild("timestamp");

        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Chat")
                .limitToLast(50);

        FirebaseRecyclerOptions<Conversation> options = new FirebaseRecyclerOptions.Builder<Conversation>()
                .setQuery(query, Conversation.class)
                .build();

        FirebaseRecyclerAdapter<Conversation, ConversationViewHolder> ConversationRecyclerViewAdapter = new
                FirebaseRecyclerAdapter<Conversation, ConversationViewHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull final ConversationViewHolder holder, int position, @NonNull final Conversation model) {
                        final String listUID = getRef(position).getKey();

                        Query lastMessageQuery = MessageRef.child(listUID).limitToLast(1);

                        lastMessageQuery.addChildEventListener(new ChildEventListener() {
                            @Override
                            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                                String data = dataSnapshot.child("message").getValue().toString();
                                holder.setMassage(data, model.isSeen());
                            }

                            @Override
                            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                            }

                            @Override
                            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                            }

                            @Override
                            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                            }

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

                            }
                        });

                        UserRef.child(listUID).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                final String userName = dataSnapshot.child("Name").getValue().toString();
                                String userThumb = dataSnapshot.child("thumbImage").getValue().toString();

                                if (dataSnapshot.hasChild("Online")) {
                                    String userOnline = dataSnapshot.child("Online").getValue().toString();
                                    holder.setUserOnline(userOnline);
                                }

                                holder.setName(userName);
                                holder.setUserImage(userThumb, getContext());

                                holder.mView.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Intent intent = new Intent(getContext(), ChatActivity.class);
                                        intent.putExtra("userID", listUID);
                                        intent.putExtra("userName", userName);
                                        startActivity(intent);
                                    }
                                });
                            }

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

                            }
                        });

                    }

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

        ConversationList.setAdapter(ConversationRecyclerViewAdapter);
        ConversationRecyclerViewAdapter.startListening();
    }


    public static class ConversationViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public ConversationViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setMassage(String message, boolean isSeen) {
            TextView userStatusView = mView.findViewById(R.id.userStatus);
            userStatusView.setText(message);

            if (!isSeen) {
                userStatusView.setTypeface(userStatusView.getTypeface(), Typeface.BOLD);
            } else {
                userStatusView.setTypeface(userStatusView.getTypeface(), Typeface.NORMAL);
            }
        }


        public void setUserOnline(String online) {
            ImageView userOnlineView = mView.findViewById(R.id.online);

            if (online.equals("true")) {
                userOnlineView.setVisibility(View.VISIBLE);
            } else {
                userOnlineView.setVisibility(View.INVISIBLE);
            }
        }

        public void setName(String userName) {
            TextView userNameView = mView.findViewById(R.id.userName);
            userNameView.setText(userName);
        }

        public void setUserImage(String userThumb, Context context) {
            CircleImageView userImageView = mView.findViewById(R.id.userImage);
            Picasso.get().load(userThumb).placeholder(R.drawable.defaultimage).into(userImageView);
        }
    }
}

朋友.java

package com.jimmytrivedi.lapitchat;

public class Friends {

    public String date;

    public Friends() {
    }

    public Friends(String date) {
        this.date = date;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

SectionPagerAdapter.java

package com.jimmytrivedi.lapitchat;

import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                RequestFragment requestFragment = new RequestFragment();
                return requestFragment;

            case 1:
                ChatFragment chatFragment = new ChatFragment();
                return chatFragment;

            case 2:
                FriendsFragment friendFragment = new FriendsFragment();
                return friendFragment;

            default:
                return null;
        }

    }

    @Override
    public int getCount() {
        return 3;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Requests";

            case 1:
                return "Chats";

            case 2:
                return "Friends";

            default:
                return null;
        }
    }
}

MainActivity.java

package com.jimmytrivedi.lapitchat;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.facebook.login.LoginManager;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ServerValue;

public class MainActivity extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private FirebaseUser currentUser;
    private Toolbar toolbar;
    private ViewPager viewPager;
    private SectionsPagerAdapter sectionsPagerAdapter;
    private TabLayout tabLayout;
    private DatabaseReference UserDatabaseReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();

        if (currentUser == null) {
            sendTostart();
        } else {
            UserDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(mAuth.getCurrentUser().getUid());
            UserDatabaseReference.child("Online").setValue("true");
        }

        viewPager = findViewById(R.id.viewPager);
        sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(sectionsPagerAdapter);

        toolbar = findViewById(R.id.mainToolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Home");

        tabLayout = findViewById(R.id.tabLayout);
        tabLayout.setupWithViewPager(viewPager);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (currentUser != null) {
            UserDatabaseReference.child("Online").setValue(ServerValue.TIMESTAMP);
        }
    }

    private void sendTostart() {
        startActivity(new Intent(MainActivity.this, StartActivity.class));
        finish();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);

        if (item.getItemId() == R.id.logout) {
            FirebaseAuth.getInstance().signOut();
            LoginManager.getInstance().logOut();
            sendTostart();
        }

        if (item.getItemId() == R.id.settings) {
            startActivity(new Intent(MainActivity.this, SettingsActivity.class));
        }

        if (item.getItemId() == R.id.allUsers) {
            startActivity(new Intent(MainActivity.this, UsersActivity.class));
        }

        return true;
    }
}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


利用

`viewPager.setOffscreenPageLimit(3);`

viewPager.setAdapter(sectionsPagerAdapter); 

在 MainActivity 中。


推荐阅读