Java 我的列表大小和索引大小相同,但我仍然得到IndexOutOfBoundsException

Java 我的列表大小和索引大小相同,但我仍然得到IndexOutOfBoundsException,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,堆栈跟踪错误 2020-04-18 14:50:38.339 11953-12018/com.shivam.chatapp2 E/AndroidRuntime: FATAL EXCEPTION: Download_Thread Process: com.shivam.chatapp2, PID: 11953 java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 at java.util.ArrayList.get(ArrayList

堆栈跟踪错误

2020-04-18 14:50:38.339 11953-12018/com.shivam.chatapp2 E/AndroidRuntime: FATAL EXCEPTION: Download_Thread
Process: com.shivam.chatapp2, PID: 11953
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.get(ArrayList.java:437)
    at com.shivam.chatapp2.Fragments.Chats.UserRef2(Chats.java:282)
    at com.shivam.chatapp2.Fragments.Chats.access$200(Chats.java:48)
    at com.shivam.chatapp2.Fragments.Chats$2$1.run(Chats.java:167)
    at java.lang.Thread.run(Thread.java:919)
我使用的标签的值

    2020-04-18 14:50:34.314 11953-12018/com.shivam.chatapp2 D/Tag2: Size for each  loop   1
2020-04-18 14:50:34.315 11953-12018/com.shivam.chatapp2 D/Tag2: Size for each  loop   2
2020-04-18 14:50:38.317 11953-12018/com.shivam.chatapp2 D/Tag2: size outside looper :   2
2020-04-18 14:50:38.319 11953-12018/com.shivam.chatapp2 D/Tag2: User List Size Two : 0
2020-04-18 14:50:38.320 11953-11953/com.shivam.chatapp2 D/Tag2: UserListSize inside Handler :  2
我试图从Firebase实时数据库中获取节点的大小,并在后台线程上计算其大小,根据从该节点获得的大小,我将侦听器添加到Firebase实时数据库的另一个节点,并打印该值,但在调用方法UserRef2()时显示IndexOutOfBoundsException

我的代码

    public class Chats extends Fragment {

    private RecyclerView recyclerView;
    private UserAdapter mUserAdapter;

    DatabaseReference reference;
    DatabaseReference rootRef;

    FloatingActionButton profile, credentials;

    private ChatsFragmentAdapter chatsFragmentAdapter;

    List<String> UserChatList = new ArrayList<>();
    List<Chatlist> usersList;
    private List<User> mUsers;

    String TAG = "Tag2";
    private static final String MESSAGE_KEY = "Message_Key";

    private Handler mHandler;

    int UserListSize;

    public Chats() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_chats, container, false);

        mHandler = new Handler(getMainLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);


                UserListSize = msg.getData().getInt(MESSAGE_KEY);
                Log.d(TAG, "UserListSize inside Handler :  " + UserListSize);


            }
        };
        String fuser;
        fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();

        rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference ChatlistRef = rootRef.child("Chatlist").child(fuser);

        ValueEventListener mValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {

                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            String userIDS = ds.getKey();

                            UserChatList.add(userIDS);
                            Log.d(TAG, "Size for each  loop   " + UserChatList.size());
                        }
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        int size_from_looper = UserChatList.size();

                        Log.d(TAG, "size outside looper :   " + size_from_looper);


                        Message message = new Message();
                        Bundle bundle = new Bundle();
                        bundle.putInt(MESSAGE_KEY, size_from_looper);
                        message.setData(bundle);

                        mHandler.sendMessage(message);


                    }
                };

                Thread thread = new Thread(runnable);
                thread.setName("Download_Thread");
                thread.start();

                Log.d(TAG, "User List Size Two : " + UserListSize);


                if (UserListSize == 0) {
                    Toast.makeText(getContext(), "No Chats Available", Toast.LENGTH_SHORT).show();
                }

                if (UserListSize == 1) {

                    UserRef1();
                } else if (UserListSize == 2) {

                    UserRef1();
                    UserRef2();

                } else if (UserListSize == 3) {

                    UserRef1();
                    UserRef2();
                    UserRef3();
                }


            }

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

            }
        };
        ChatlistRef.addValueEventListener(mValueEventListener);

        return view;
    }

    private void UserRef1() {

        DatabaseReference UserRef1 = rootRef.child("Users").child(UserChatList.get(1));
        ValueEventListener eventListener1 = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                User user = dataSnapshot.getValue(User.class);
                mUsers.add(user);
                mUserAdapter.notifyDataSetChanged();
                String name = dataSnapshot.child("First").getValue(String.class);
                Log.d(TAG, "Name called  " + name);

            }

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

            }
        };
        UserRef1.addValueEventListener(eventListener1);

    }

    private void UserRef2() {

        DatabaseReference UserRef2 = rootRef.child("Users").child(UserChatList.get(2));
        ValueEventListener eventListener2 = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                User user = dataSnapshot.getValue(User.class);
                mUsers.add(user);
                mUserAdapter.notifyDataSetChanged();
                String name = dataSnapshot.child("First").getValue(String.class);
                Log.d(TAG, "Name called  " + name);

            }

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

            }
        };
        UserRef2.addValueEventListener(eventListener2);
    }

    private void UserRef3() {
        DatabaseReference UserRef3 = rootRef.child("Users").child(UserChatList.get(3));
        ValueEventListener eventListener3 = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                User user = dataSnapshot.getValue(User.class);
                mUsers.add(user);
                mUserAdapter.notifyDataSetChanged();
                String name = dataSnapshot.child("First").getValue(String.class);
                Log.d(TAG, "Name called  " + name);

            }

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

            }
        };
        UserRef3.addValueEventListener(eventListener3);
    }
}
公共类聊天扩展片段{
私人回收站;
专用用户适配器;
数据库参考;
数据库参考rootRef;
浮动操作按钮配置文件、凭证;
私有ChatsFragmentAdapter ChatsFragmentAdapter;
List UserChatList=new ArrayList();
列出用户列表;
私人博物馆名单;
String TAG=“Tag2”;
私有静态最终字符串MESSAGE\u KEY=“MESSAGE\u KEY”;
私人经理人;
int UserListSize;
公众聊天(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u chats,container,false);
mHandler=新处理程序(getMainLooper()){
@凌驾
公共无效handleMessage(@NonNull Message msg){
超级handleMessage(msg);
UserListSize=msg.getData().getInt(消息键);
d(标记“UserListSize-insidehandler:”+UserListSize);
}
};
串定影器;
fuser=FirebaseAuth.getInstance().getCurrentUser().getUid();
rootRef=FirebaseDatabase.getInstance().getReference();
DatabaseReference ChatlistRef=rootRef.child(“Chatlist”).child(fuser);
ValueEventListener mValueEventListener=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
Runnable Runnable=新的Runnable(){
@凌驾
公开募捐{
对于(DataSnapshot ds:DataSnapshot.getChildren()){
字符串userid=ds.getKey();
添加(userid);
Log.d(标记“每个循环的大小”+UserChatList.Size());
}
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
int size_from_looper=UserChatList.size();
Log.d(标签,“外部活套尺寸:”+活套尺寸);
消息消息=新消息();
Bundle=新Bundle();
bundle.putInt(消息密钥,来自循环器的大小);
message.setData(bundle);
mHandler.sendMessage(消息);
}
};
线程线程=新线程(可运行);
setName(“下载线程”);
thread.start();
Log.d(标签,“用户列表大小2:”+UserListSize);
如果(UserListSize==0){
Toast.makeText(getContext(),“无可用聊天”,Toast.LENGTH_SHORT.show();
}
如果(UserListSize==1){
UserRef1();
}else if(UserListSize==2){
UserRef1();
UserRef2();
}else if(UserListSize==3){
UserRef1();
UserRef2();
UserRef3();
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
ChatlistRef.addValueEventListener(mValueEventListener);
返回视图;
}
私有void UserRef1(){
DatabaseReference UserRef1=rootRef.child(“用户”).child(UserChatList.get(1));
ValueEventListener eventListener1=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
User=dataSnapshot.getValue(User.class);
添加(用户);
mUserAdapter.notifyDataSetChanged();
String name=dataSnapshot.child(“First”).getValue(String.class);
Log.d(标签,“名为”+名);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
UserRef1.addValueEventListener(eventListener1);
}
私有void UserRef2(){
DatabaseReference UserRef2=rootRef.child(“Users”).child(UserChatList.get(2));
ValueEventListener eventListener2=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
User=dataSnapshot.getValue(User.class);
添加(用户);
mUserAdapter.notifyDataSetChanged();
String name=dataSnapshot.child(“First”).getValue(String.class);
Log.d(标签,“名为”+名);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
UserRef2.addValueEventListener(eventListener2);
}
私有void UserRef3(){
DatabaseReference UserRef3=rootRef.child(“Users”).child(UserChatList.get(3));
ValueEventListener eventListener3=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
UserChatList.get(1) to UserChatList.get(0)
UserChatList.get(2) to UserChatList.get(1)
UserChatList.get(3) to UserChatList.get(2)