【问题标题】:Index OutOfBoundsException in AndroidAndroid中的索引OutOfBoundsException
【发布时间】:2018-01-06 08:43:52
【问题描述】:

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 = "";
}

我还是个初学者。只是尝试一个使用电话号码进行身份验证的简单聊天应用程序。注册和登录似乎很好。即使更新用户个人资料也很好。然后我得到这个片段,它向用户显示使用该应用程序的联系人列表。此片段成功地从数据库中获取名称列表并显示它,但是当用户单击其中一个名称时,它会显示异常。用户应该被带到 chat.class 那里他将能够与其他人聊天(希望如此) 请帮忙... 在 UserDetails.chatWith = al.get(Position) 行中显示和 IndexOUTOfBounds 异常 索引 0 无效,大小为 0

【问题讨论】:

  • 显示你的 logcat 并且不要在 onDataChange 中设置适配器
  • 你在哪里定义了“al”?缺少某些代码。
  • 嘿 Courtney,我们需要有关 UserDetails 类以及 al 变量的信息。请提供更多代码。
  • 请看已编辑的
  • @CourtneyMiller 您没有向al 添加元素,因此其大小为0

标签: android database firebase firebase-realtime-database indexoutofboundsexception


【解决方案1】:

将数据保存到 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】:

    使用 alarrayList 以及另外一个建议,不要在 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;
    }
    

    【讨论】:

    • Tysm...抱歉还是个初学者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2015-09-08
    • 2012-01-01
    • 2015-09-05
    • 2012-12-27
    相关资源
    最近更新 更多