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



StackTrace错误

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

当大小为1时,索引应该为0,因为索引总是从0 开始

因此,在您的代码更改中:

UserChatList.get(1) to UserChatList.get(0)
UserChatList.get(2) to UserChatList.get(1)
UserChatList.get(3) to UserChatList.get(2)

否。如果索引大小为2,则必须使用小于或等于1(i<=1(的索引。

因为索引号从0开始,所以大小从1开始。

最新更新