在另一个 Activity 中将字符串(或数组)传递给 ListView(NPE 错误)

Posted

技术标签:

【中文标题】在另一个 Activity 中将字符串(或数组)传递给 ListView(NPE 错误)【英文标题】:Pass String (or Array) to ListView in another Activity (NPE error) 【发布时间】:2021-07-27 18:12:44 【问题描述】:

我想在 ExpAct (2.Activity) 中的 MainActivity 中使用工作 ListView。

我所拥有的:Edittext 和一个在单击时为 Listview 创建一个新条目的按钮。 MainAct 上的 ListView 仅用于检查,如果 ExpAct 有效,将被删除。 单击“下一步”按钮后,我进入 ExpAct。

我收到原始使用参数警告。 -- 如果我要解决这个问题,它会给我一个 ExpAct 的 NPE 崩溃,或者一个空的 ListView。

字符串/数组的getter Intent 不起作用的问题是什么?还是与 ArrayAdapter 的创建有关?

MainActivity.java

public class MainActivity extends AppCompatActivity 
     ListView LV1;
     ArrayList < String > listExp;
     Button button1, btnext;
     EditText ETbc;
     ArrayAdapter < String > arrayAdapter;

     @Override
     protected void onCreate(Bundle savedInstanceState) 
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         LV1 = findViewById(R.id.LV1);
         button1 = findViewById(R.id.button1);
         ETbc = findViewById(R.id.ETbc);
         listExp = new ArrayList < String > ();
         arrayAdapter = new ArrayAdapter < String > (getApplicationContext(),
             android.R.layout.simple_list_item_1, listExp);
         button1.setOnClickListener(new View.OnClickListener() 
             @Override
             public void onClick(View v) 
                 String names = ETbc.getText().toString();
                 listExp.add(names);
                 LV1.setAdapter(arrayAdapter);
                 arrayAdapter.notifyDataSetChanged();
                 Intent inter = new Intent(MainActivity.this, ExpAct.class);
                 inter.putExtra("key", listExp);
                 setResult(Activity.RESULT_OK, inter);
             
         );
         btnext = findViewById(R.id.btnext);
         btnext.setOnClickListener(new View.OnClickListener() 
             @Override
             public void onClick(View v) 
                 Intent intent = new Intent(MainActivity.this, ExpAct.class);
                 startActivity(intent);
                 finish();
             
         );
     
 

*ExpAct.java: *

public class ExpAct extends MainActivity 
    ListView LV2;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exp);

        Intent i = getIntent();
        listExp = i.getStringArrayListExtra("key");

        LV2 = findViewById(R.id.LV2);
        ArrayAdapter arrayAdapter = new ArrayAdapter < String > (getApplicationContext(),
            android.R.layout.simple_list_item_1, R.id.LV2, listExp);  // here without R.id.LV2 
        LV2.setAdapter(arrayAdapter);    
    

日志,因为它变红了。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testcheckbox, PID: 20358
    java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.testcheckbox/com.example.testcheckbox.ExpAct. 
      java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6255)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:344)
        at android.widget.ListView.setAdapter(ListView.java:510)
        at com.example.testcheckbox.ExpAct.onCreate(ExpAct.java:27)
        at android.app.Activity.performCreate(Activity.java:6670)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527) 
        at android.os.Handler.dispatchMessage(Handler.java:110) 
        at android.os.Looper.loop(Looper.java:203) 
        at android.app.ActivityThread.main(ActivityThread.java:6255) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 
Disconnected from the target VM, address: 'localhost:57662', transport: 'socket'

【问题讨论】:

【参考方案1】:

您似乎正在尝试启动 Activity,而不是将 ArrayList 作为额外的。

btnext = findViewById(R.id.btnext);
btnext.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
       Intent intent = new Intent(MainActivity.this, ExpAct.class);
       // You need to put the extra data here:
       intent.putExtra("key", listExp);
       startActivity(intent);
       finish();
    
);

当你得到一个 NullPointerException 时,你应该首先检查为什么列表会为空:

尝试调用接口方法'int java.util.List.size()' 空对象引用

所以在查看了您的代码之后,我发现您没有传递 ArrayList 的意图。

【讨论】:

我以为之前的 button1.setOnClickListener 每次按下都会传递 ArrayList。谢谢!

以上是关于在另一个 Activity 中将字符串(或数组)传递给 ListView(NPE 错误)的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将某种结构化的文本文件读入数组

我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]

将参数传递给Lua 4中的函数[重复]

如何在 Javascript .filter() 方法中将额外参数传递给回调函数?

如何在 C++ 中将数组 char 复制到字符串或 int* (void *) 中? [关闭]

在 C# 中将查询参数作为参数传递给 BigQuery 中的 IN 运算符的正确方法