在setContentView调用之后从用户输入更新ListView

时间:2011-01-23 14:35:51

标签: android listview user-interface android-listview

我想显示一个空列表视图,然后由用户输入填充。我有UI流程工作,并在用户通过setContentView调用的视图(即没有新的Activity)输入一些信息后填充我的自定义对象列表。

我接受输入并将其添加到列表中,我希望在ListView上对其进行汇总。但是,每当我添加到列表和/或ArrayAdapter并调用adapter.notifyDataSetChanged()时,它就不会执行我想要的操作。 ListView仍然是空的。哎呀!这让我疯了!

@Override
public void onCreate(Bundle blah) {
    ListView listView = (ListView) findViewById(R.id.results_list);
    listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list));
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.mnu_add:
        final Activity act = this;
        setContentView(R.layout.record_details);// the sub-view that takes the user input
        // the button on the form to 'add' details:-
        ((Button) findViewById(R.id.recored_details_add_btn))
        .setOnClickListener(
            new OnClickListener() {
            public void onClick(View v) {
                    // get input from widgets 
                    list.add(someObject);
                    ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged();
                    setContentView(R.layout.list_view);

                }
            }
        );
        ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged();
        break;
    }
    return true;
}

请把我从痛苦中解救出来并告诉我我的愚蠢行为?

提前致谢。

2 个答案:

答案 0 :(得分:2)

public void onClick(View v) {
    // get input from widgets 
    list.add(someObject);
    ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged();
    setContentView(R.layout.list_view);

setContentView处理程序中的onClick是否可能正在创建列表视图窗口小部件的新实例(没有适配器)或重新初始化列表视图(清除适配器)?

首先尝试在onCreate的列表中放入一些内容,然后点击按钮时它是否会消失。

我还没有看到任何代码(虽然我是一个相对新手)在活动的生命周期内切换视图,从根本上调出不同的页面 - 大多数使用单独的活动。

编辑:

OP问道:

  

谢谢...那么我怎样才能得到我想要的东西?我支持适配器的列表是静态的;我应该只使用活动而依赖静态字段中的onCreate加载吗?

一些选项:

  1. 使用单独的活动

  2. 重新关联适配器(再次调用setAdapter) - 可能是个坏主意

  3. 在同一文件中声明两个布局。您将隐藏一个并取消隐藏另一个以在视图之间切换而不是调用setContentView。这与ListView布局的工作方式类似(一个用于列表为空时,一个用于列表为空时)。我想我已经在网上看到了这个例子,但我现在没有参考。

答案 1 :(得分:1)

您可以在创建意图时使用Intent.FLAG_ACTIVITY_SINGLE_TOP标记重新启动相同的活动并覆盖onNewIntent()方法。

onNewIntent()内,您使用更新的数据创建适配器并调用setAdapter

我认为这会给你预期的行为。