【问题标题】:Getting error java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference [duplicate]出现错误 java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()”[重复]
【发布时间】:2020-01-12 07:14:57
【问题描述】:

我收到错误:java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference。我试图找出确切的问题,但无法确定确切的位置。希望有人可以提供帮助。我有 2 个单独的布局,带有 2 个单独的适配器和列表视图。一直在为此苦苦挣扎,希望有解决方案。非常感谢!

    public class viewContacts extends AppCompatActivity {

      private static final String TAG = viewContacts.class.getSimpleName();
      ListView listView_Android_Contacts;
      ListView viewContacts;
      View currentSelected;
      Cursor c;
      String contactName;
      CardView saveContacts;
      String phoneNumber;
      CheckBox cb;
      String currentContactName;
      ArrayList<String> selectedContacts;
      ArrayList<String> contacts;
      ArrayList<String> listMessages;
      LinearLayout linearMain;
      ListView currentContactsList;
      String contactEntry;
      public List<String> savedContacts;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts_list);
        final ListView currentContactsList = findViewById(R.id.currentContactsList);
        setContentView(R.layout.activity_view_contacts);
        saveContacts = findViewById(R.id.saveContacts);
        final ListView viewContacts = findViewById(R.id.contactsView);
        Dexter.withActivity(this)
                .withPermission(Manifest.permission.READ_CONTACTS)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse response) {
                        get();
                    }


                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse response) {
                        // check for permanent denial of permission
                        if (response.isPermanentlyDenied()) {
                            // navigate user to app settings
                        }
                    }


                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).check();
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_multiple_choice, contacts
        );
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, selectedContacts);
        viewContacts.setAdapter(adapter);
        currentContactsList.setAdapter(arrayAdapter);
        viewContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedFromList = (String) viewContacts.getItemAtPosition(position);
                Toast.makeText(viewContacts.this, selectedFromList,Toast.LENGTH_SHORT).show();
            }
        });
        saveContacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectedContacts = new ArrayList<>();
                List<Integer> checkedIDs = new ArrayList<Integer>();
                final SparseBooleanArray checkedItems = viewContacts.getCheckedItemPositions();
                for (int i = 0; i < checkedItems.size(); i++){
                    final boolean isChecked = checkedItems.valueAt(i);
                    if (isChecked){
                        final int position = checkedItems.keyAt(i);
                        String s = (String) viewContacts.getItemAtPosition(position);
                        selectedContacts.add(s);
                        checkedIDs.add(position);
                    }

                }
                startActivity(new Intent(viewContacts.this, contactsList.class));
            }
        });
    }

    public void get(){

        c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME );
        contacts = new ArrayList<>();
        while(c.moveToNext()){
            contactName = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            phoneNumber = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            contacts.add( contactName + "\n" + phoneNumber);

            Log.d(TAG, "show contacts:");
        }
        c.close();
    }
}

【问题讨论】:

  • 请同时附上错误日志...即使您指出了错误,其他人也可能从中看到更多有用的信息以帮助您。
  • 看代码 好像可以在线checkedItems.size() 但是你可以从错误日志中弄清楚 它会说类似Caused by: SomeClass.java:123 123是导致的行号错误。
  • U r 在您的代码中使用了两个 setContentView()....删除其中一个。

标签: java android listview adapter


【解决方案1】:

你在代码中调用size()的唯一地方是这里:

        for (int i = 0; i < checkedItems.size(); i++){

假设这是引发异常的地方,checkedItems 必须是 null

因此viewContacts.getCheckedItemPositions() 必须返回null

这是我们所能提供的信息。

剩下的诊断工作交给你。


更新

您似乎以不同的视图调用了两次setContentView。那是行不通的。 Activity 仅具有一个内容视图。

这可能解释了 NPE。两个视图之一不会(不能)连接到 Activity,这可能就是它返回 null 的原因。

您需要创建一个包含/组合您的两个布局的布局。或者也许在两种布局之间切换。 (不确定……)

【讨论】:

  • 我认为你是对的,导致错误的行是 currentContactsList.setAdapter(arrayAdapter);我更改视图的原因是因为我要使用的列表来自不同的活动,我想从我当前的活动中更新列表。你建议我怎么做?感谢您的回复。
猜你喜欢
  • 2020-08-25
  • 2019-12-20
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多