【问题标题】:Android: Using ListView ArrayAdapter/ArrayListAndroid:使用 ListView ArrayAdapter/ArrayList
【发布时间】:2013-01-04 18:19:19
【问题描述】:

我是使用 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();

        }
    });

【问题讨论】:

  • 你有强制关闭发生时的堆栈跟踪吗?
  • values 是我的 ArrayList 的名称。我有一个按钮接收 EditText 文本,然后转换为字符串。然后我把它放入称为值的数组列表中
  • 赋值是否占据整个ArrayList?如果您的 ArrayList 大于您使用它的大小,则数组中存在未使用的空值位置,这可能会导致强制关闭。山姆的回答表明了同样的看法。
  • 啊,我想我明白你的意思了。谢谢!
  • "但是谁能告诉我为什么我不需要在我的 ArrayAdapter 构造函数中有一个字符串数组参数"This construtor 假设您稍后将调用add()insert() 等填充您的 ListView。

标签: android arrays


【解决方案1】:

如果第二种方法有效但第一种方法无效,则values 至少有一个元素是null。当适配器尝试将此空值与 TextView 绑定时,这将引发异常。
只需从values 中删除所有空数据。

来自 ArrayAdapter 的source code

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 错误和调试器非常方便的地方。

【讨论】:

  • 我也确定 values 为空
  • 我没有尝试将值设为空,但我可能已经做到了。我没有第一种方法的完整代码,所以我无法完全解释。
  • "我没有尝试让值为空" 好吧,没有人故意让他们的应用程序崩溃,但我们都这样做了。 :) “我没有第一种方法的完整代码,所以我无法完全解释。”我的回答是否帮助您了解正在发生的事情?如果是这样,请接受它,因为我不确定在没有更多细节的情况下,除了我已经写过的内容之外,任何人都可以回答您的原始问题......
【解决方案2】:

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

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

【讨论】:

  • 如果第二种方法与this 一起使用,更改上下文引用如何解决错误?
  • 我实际上确实尝试过这种方法(更改上下文引用)..但它仍然导致强制关闭。所以我认为@Sam 是正确的,因为我将数组列表值设为空。
  • @Sam:我突然想到可能存在与上下文相关的问题;如果我们排除了我们的ListViewArrayList 对象不是null。引用上下文不会导致问题,它只是可以解决错误。但是,如果我们确保 values 和 lv 没问题,那么在我看来,这段代码应该可以工作。
  • @user1949400 这只是一个长镜头,但我只是想指出这一点。
  • 好的,当我再次尝试时,我会发布代码。因为我不想在将来因为这个而遇到更多问题,因为我会添加更多功能。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2013-08-26
    相关资源
    最近更新 更多