代码之家  ›  专栏  ›  技术社区  ›  user9027554

Android中的索引OutOfBoundsException

  •  0
  • user9027554  · 技术社区  · 7 年前

    OnCreateView方法

    ListView usersList;
    TextView noUsersText;
    ArrayList<String> al = new ArrayList<>();
    int totalUsers = 0;
    ProgressDialog mProgressDialogue;
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
    
        usersList = (ListView)rootView.findViewById(R.id.usersList);
        noUsersText = (TextView)rootView.findViewById(R.id.noUsersText);
    
        mProgressDialogue = new ProgressDialog(getActivity());
        mProgressDialogue.setMessage("Loading...");
        mProgressDialogue.show();
    
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference usersRef = rootRef.child("Users");
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<String> arrayList = new ArrayList<>();
                ListView listView = (ListView) rootView.findViewById(R.id.usersList);
                ArrayAdapter<String> adapter;
                adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, arrayList);
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String name = ds.child("Name").getValue().toString();
    //                    Log.d("TAG", name);
                    arrayList.add(name);
                }
                listView.setAdapter(adapter);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(),"Please Check Your Internet Connection",Toast.LENGTH_SHORT).show();
            }
        };
        usersRef.addListenerForSingleValueEvent(eventListener);
    
        usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                UserDetails.chatWith = al.get(position);
                Intent intent = new Intent(getActivity(), Chat.class);
                startActivity(intent);
            }
        });
        return rootView;
    }
    

    用户详细信息

    public class UserDetails {
    static String phonenumber = "";
    static String chatWith = "";
    }
    

    我还是个初学者。只是尝试一个简单的聊天应用程序,它使用电话号码进行身份验证。注册和登录似乎很好。即使更新用户配置文件也可以。然后我看到这个片段,它向用户显示了使用该应用程序的联系人列表。此片段成功地从数据库中获取名称列表并显示它,但当用户单击其中一个名称时,它会显示一个异常。应将用户带到聊天室。课堂上,他将能够与其他人聊天(希望如此) 请帮助。。。 在UserDetails行中显示并索引OUTFBOUNDS异常。聊天=获取(位置) 索引0无效,大小为0

    2 回复  |  直到 7 年前
        1
  •  0
  •   Yuliwee    7 年前

    将数据保存到al,而不是像这样的新ArrayList:

    @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ListView listView = (ListView) rootView.findViewById(R.id.usersList);
                ArrayAdapter<String> adapter;
                adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, al);
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String name = ds.child("Name").getValue().toString();
    //                    Log.d("TAG", name);
                    al.add(name);
                }
                listView.setAdapter(adapter);
            }
    
        2
  •  0
  •   Shruti    7 年前

    使用 al公司 阵列列表 还有一个建议,不要在中初始化/设置适配器 onDataChange . 您可以在中初始化或设置它 onCreateView 并从 onDataChange公司 如下所示:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
    
        usersList = (ListView) rootView.findViewById(R.id.usersList);
        noUsersText = (TextView) rootView.findViewById(R.id.noUsersText);
    
        ArrayList<String> arrayList = new ArrayList<>();
        ListView listView = (ListView) rootView.findViewById(R.id.usersList);
        ArrayAdapter<String> adapter;
        listView.setAdapter(adapter);
    
        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, arrayList);
    
        mProgressDialogue = new ProgressDialog(getActivity());
        mProgressDialogue.setMessage("Loading...");
        mProgressDialogue.show();
    
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference usersRef = rootRef.child("Users");
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
    
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    String name = ds.child("Name").getValue().toString();
    //              Log.d("TAG", name);
                    arrayList.add(name);
                    // or al.add(name);
                }
                adapter.notifyDataSetChanged(); 
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(), "Please Check Your Internet Connection", Toast.LENGTH_SHORT).show();
            }
        };
        usersRef.addListenerForSingleValueEvent(eventListener);
    
        usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                UserDetails.chatWith = arrayList.get(position);
                //UserDetails.chatWith = al.get(position);
                Intent intent = new Intent(getActivity(), Chat.class);
                startActivity(intent);
            }
        });
        return rootView;
    }