【问题标题】:Update ListView from user input after setContentView call在 setContentView 调用后从用户输入更新 ListView
【发布时间】:2011-01-23 14:35:51
【问题描述】:

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

我接受输入并将其添加到列表中,我希望在 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;
}

请把我从痛苦中解救出来,告诉我我的愚蠢吗?

提前致谢。

【问题讨论】:

    标签: android listview user-interface android-listview


    【解决方案1】:
    public void onClick(View v) {
        // get input from widgets 
        list.add(someObject);
        ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged();
        setContentView(R.layout.list_view);
    

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

    尝试先在onCreate 中放入列表中的内容,然后查看单击按钮时它是否消失。

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

    编辑:

    OP 询问:

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

    一些选项:

    1. 使用单独的活动

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

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

    【讨论】:

    • 我在 onCreate 中添加了一个相同自定义类的实例,它在第一个视图中可见(好吧,toString 的结果是可见的),但是当我单击子视图上的添加按钮时消失了!
    • @atc - 我认为这证实了这一理论。当您调用setContentView() 时,您正在创建/重新初始化列表视图。无论如何,适配器不再关联。多次调用setContentView 可能还有其他副作用。
    • 谢谢...那么我怎样才能得到我想要的呢?我支持适配器的列表是静态的;我应该只使用活动并依赖静态字段的 onCreate 加载吗?
    • 我已经改用 startActivity 修改了上面的代码,由于该字段的静态性质,这可以正常工作。感觉不对!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2015-12-17
      • 2020-06-29
      相关资源
      最近更新 更多