Java ArrayList已初始化,但在尝试.add(string)方法时仍返回NullPointerException

Java ArrayList已初始化,但在尝试.add(string)方法时仍返回NullPointerException,java,android,arraylist,adapter,Java,Android,Arraylist,Adapter,我在尝试向ArrayList使用add方法时出现此错误。我可以看到很多人都有同样的问题,但是他们在添加元素之前没有初始化arraylist。但是我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false public class ShowTalkActivity extends Activity implements OnClickListener { private ListView listView; ArrayList&

我在尝试向ArrayList使用add方法时出现此错误。我可以看到很多人都有同样的问题,但是他们在添加元素之前没有初始化arraylist。但是我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false

public class ShowTalkActivity extends Activity implements OnClickListener {

    private ListView listView;
    ArrayList<String> messages;
    ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_talk);

        Intent intent = getIntent();
        String selected = intent.getStringExtra("selected");
        setTitle(selected);

        listView = (ListView) findViewById(R.id.messagesList);
        messages = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);
        listView.setAdapter(adapter);

        ((Button) findViewById(R.id.sendMessage)).setOnClickListener(this);
    }

...

    @Override
    public void onClick(View view) {
        System.out.println(messages==null);
        messages.add("Anything");
        adapter.notifyDataSetChanged();
    }
}

编辑:我完全错了。这句话错了:
不能使用空的ArrayList设置适配器,即使您之前初始化了它。适配器将找不到值并引发异常。
所以我的解决方案是无用的。如果没有用的话,我会在两天内删除它。我后来确实注意到了问题所在,但其他人已经回答了。:) 编辑结束

不能使用空的ArrayList设置适配器,即使您之前已初始化它。适配器将找不到值并引发异常

试试这个:

public class ShowTalkActivity extends Activity implements OnClickListener {

private ListView listView;
ArrayList<String> messages;
ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_talk);

    Intent intent = getIntent();
    String selected = intent.getStringExtra("selected");
    setTitle(selected);

    listView = (ListView) findViewById(R.id.messagesList);
    messages = new ArrayList<String>();
    //adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);
    //listView.setAdapter(adapter);

    ((Button) findViewById(R.id.sendMessage)).setOnClickListener(this);
}
公共类ShowTalkActivity扩展活动实现OnClickListener{
私有列表视图列表视图;
ArrayList消息;
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u show\u talk);
Intent=getIntent();
选定字符串=intent.getStringExtra(“选定”);
片名(选定);
listView=(listView)findViewById(R.id.messagesList);
messages=newarraylist();
//adapter=new ArrayAdapter(此,R.layout.message\u list\u行,R.id.messages列表,messages);
//setAdapter(适配器);
((按钮)findViewById(R.id.sendMessage)).setOnClickListener(此);
}

@覆盖
公共void onClick(视图){
//System.out.println(messages==null);
信息。添加(“任何内容”);
if(适配器==null){
adapter=new ArrayAdapter(此,R.layout.message\u list\u行,R.id.messages列表,messages);
setAdapter(适配器);
}
否则{
adapter.addAll(消息);
adapter.notifyDataSetChanged();
}
}
希望我了解您的需要。

MainActivity.java

package com.example.example;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.ListView;
公共类MainActivity扩展活动实现OnClickListener{
私有列表视图列表视图;
ArrayList消息;
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
设定所有权(“设定所有权”);
listView=(listView)findViewById(R.id.messagesList);
messages=newarraylist();
适配器=新阵列适配器(此,R.layout.message\u list\u行,
R.id.messages列表,消息);
setAdapter(适配器);
按钮sendmessage=(按钮)findViewById(R.id.sendmessage);
sendmessage.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
System.out.println(messages==null);
信息。添加(“任何内容”);
adapter.notifyDataSetChanged();
}

}
查看logcat,很明显,当它指的是设置某个TextView或其他View对象时,抛出了一个空对象引用错误,几乎可以肯定的是,View对象没有正确设置。这就是当您遇到这些错误时必须查看的地方

此外,列表不必包含要设置为适配器的内容。 正如您在下面的代码中所看到的,
1) 我创建了一个新的“list_for_comm”实例

2) 然后我将其设置为适配器“Adapter\u comm”

3) 然后我继续用空字符串填充列表

4) 然后,如果希望在UI中实际看到列表更改,请使用“notifyDataSetChanged”通知适配器

5) 如果你的脸上还没有笑容,那就微笑吧

public void initAllCommListStuff()
{
    lv_comm = (ListView_CommBar) findViewById(R.id.listView_with_comm_bar);
    lv_comm.setDivider(null);

    list_for_comm = new ArrayList<>(5);
    adapter_comm = new Adapter_CommBar(DisplayContactActivity.this, R.layout.comm_bar_layout_dc_portrait, list_for_comm);
    lv_comm.setAdapter(adapter_comm);

    for (int i=0; i<5; i++)
    {
        list_for_comm.add(new Adapter_GetSet_MovingBar(i, "", ""));
    }
    adapter_comm.notifyDataSetChanged();
}
public void initAllCommListStuff()
{
lv_comm=(ListView_CommBar)findViewById(R.id.ListView_,带_comm_bar);
低压通信设置除法器(空);
列表\u for_comm=新阵列列表(5);
adapter\u comm=新适配器\u CommBar(显示ContactActivity.this,R.layout.comm\u bar\u layout\u dc\u肖像,列表\u用于\u comm);
低压通信设置适配器(适配器通信);

for(int i=0;i从logcat
System.out.println(messages==null)加载堆栈跟踪;返回false。
?什么意思?
System.out.println(messages==null);打印错误。
?复制您的logcat输出!文本视图在哪里?是
R.id.messagesList
。您没有R.id.TextView吗?是的。请。
R.id.messagesList引用列表视图。
。这看起来不正常。阵列适配器不需要这样。我尝试了您所说的,但我得到了相同的错误。这对我来说是有意义的,但是很明显,它的行为指向了相同的结果。
你不能用空的ArrayList设置适配器,即使你之前初始化过它。
。我想你可以。这没有问题。我也有同样的问题,我发布的解决方案确实对我有效。我将研究不同的解决方案。太好了,伙计!成功了!问题是:在消息中st_row.xml,我用布局中使用的错误id设置TextView。我写的是messagesRow而不是messagesList。谢谢!
@Override
public void onClick(View view) {
    //System.out.println(messages==null);
    messages.add("Anything");
    if (adapter == null) {
      adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);         
      listView.setAdapter(adapter);
    }
    else {
      adapter.addAll(messages);
      adapter.notifyDataSetChanged();
    }
}
public void initAllCommListStuff()
{
    lv_comm = (ListView_CommBar) findViewById(R.id.listView_with_comm_bar);
    lv_comm.setDivider(null);

    list_for_comm = new ArrayList<>(5);
    adapter_comm = new Adapter_CommBar(DisplayContactActivity.this, R.layout.comm_bar_layout_dc_portrait, list_for_comm);
    lv_comm.setAdapter(adapter_comm);

    for (int i=0; i<5; i++)
    {
        list_for_comm.add(new Adapter_GetSet_MovingBar(i, "", ""));
    }
    adapter_comm.notifyDataSetChanged();
}