1

我是使用 Android 编程的新手,我试图通过允许用户通过 EditText 输入文本来制作 ListView。我终于让它工作了,但是我不太确定为什么我的第一种方法不起作用:

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,values);
lv.setAdapter(adapter);

这导致应用程序启动时强制关闭,我发现这是由于 lv.setAdapter(adapter)

在经历了许多 stackoverflow 问题后,我看到一个答案说不需要使用 ArrayList 和 ArrayAdapter。所以我尝试了以下方法,它奏效了:

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    lv.setAdapter(adapter);

这一次当我没有创建数组列表时它工作得很好。

所以,我的问题是为什么当我没有在我的 ArrayAdapter 中定义/创建字符串数组时这会起作用,以及为什么我的第一个方法不起作用。

提前感谢您的帮助,如果我没有发布足够的代码,我很抱歉。

编辑: 这是我下面的第一个方法我试图重新创建我的第一个方法,它在下面:它仍然像第一次一样强制关闭。请注意,在我的第二种方法(有效)中,我所做的只是不使用 ArrayList 并在 arrayAdapter 构造中采用第三个参数。同样,既然您的回答告诉我,我的值可能为“null”,我认为您是正确的。我怎样才能纠正这个以备将来使用?谢谢!

public class TaskPage extends SherlockActivity {

EditText display;
ListView lv;
ArrayAdapter<String> adapter;
Button addButton;
ArrayList<String> values;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    display = (EditText) findViewById(R.id.editText1);
    lv = (ListView) findViewById(R.id.listView1);
    addButton = (Button) findViewById(R.id.button1);


    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
    lv.setAdapter(adapter);


    addButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String task = display.getText().toString();
            values.add(task);
            adapter.notifyDataSetChanged();

        }
    });
4

3 回答 3

4

如果第二种方法有效,但第一种方法无效,则values至少有一个元素是null. 当 Adapter 尝试将此 null 值与 TextView 绑定时,这将引发异常。
只需从values.

来自 ArrayAdapter 的源代码

T item = getItem(position);
if (item instanceof CharSequence) { // A null value throws an NPE here
    text.setText((CharSequence)item);
} else {
    text.setText(item.toString());
}

我越想它values本身也可能是空的……这就是 LogCat 错误和调试器非常方便的地方。

于 2013-01-04T18:25:15.507 回答
0

确保valuesandlv不为空,并且不包含任何空元素后,这应该在 YourActivity 中工作,或者属于它的子类。:

adapter = new ArrayAdapter<String>(YourActivity.this, android.R.layout.simple_list_item_1, values);
lv.setAdapter(adapter);
于 2013-01-04T18:36:26.700 回答
0

这篇文章很老了,但我遇到了它,想补充一下对我的修复。根据文档(http://developer.android.com/reference/android/widget/ArrayAdapter.html),“默认情况下,此类期望提供的资源 id 引用单个 TextView。” 我在里面使用了一个带有 TextView 的 RelativeLayout。这有点明显,但如果它可以帮助别人......

于 2013-11-07T15:01:18.783 回答