【问题标题】:How to update SimpleAdapter in Android如何在 Android 中更新 SimpleAdapter
【发布时间】:2011-03-19 19:21:18
【问题描述】:

是否可以更新 SimpleAdapter?我有一个数据列表和一个显示“查看下一个结果”的页脚,当单击该列表项时,我会捕获事件并获取新数据。然后我想用这个新数据替换 ListView 中的数据,但我不知道该怎么做。有任何想法吗?我不想使用 ArrayAdapter,因为据我所知,这些项目只能容纳一个字符串,而我需要它来容纳多个字符串和整数。

【问题讨论】:

    标签: android listview listadapter


    【解决方案1】:

    更新:根据del116,确实可以给SimpleAdapter一个可变映射,然后在需要更新列表时手动调用适配器的notifyDataSetChanged方法。但是,我的以下观点是关于 SimpleAdapter 的文档,该文档指定它用于静态数据;将它用于可变数据与它的设计背道而驰,所以如果你使用这种技术,我一定会检查它是否在新的 Android 版本出现时继续工作。

    (原文如下:)

    如果您查看SimpleAdapter description,它会说它是“将 静态数据 映射到 XML 文件中定义的视图的简单适配器。”我已经添加了重点——简单地说,SimpleAdapater 不是为使用变化的数据而构建的;它只处理静态数据。如果您不能使用ArrayAdapter,因为您的数据包含不止一位文本,那么您将不得不构建自己的自定义ListAdapter,或者将您的数据放入数据库并使用@987654324 之一@s.

    作为最后的手段,如果您不需要太多性能,您可以更新由SimpleAdapter 支持的ListView,方法是在您的数据任何时候构建一个全新的SimpleAdapter 实例更改并通过setListAdapter 告诉列表视图使用它。

    【讨论】:

    • 您在这里的回答确实具有误导性。更新数组数据并在我的 SimpleAdapter 上调用 notifyDataSetChanged() 后,我能够更新 simpleAdapter。无需使用 ArrayAdapter 调用 notifyDataSetChanged()。
    • @dell116 够公平的。我在回答的最后提到了这种可能性,但我根据您的反馈将其提升到了顶部,即它确实有效;我没有测试过它。我仍然认为这样做需要谨慎,因为 SimpleAdapter 文档明确指出它是针对静态数据的。
    • 现在回想起来……哇。我对编程或 SimpleAdapter 的预期目的一无所知。如果您正在使用由会更改的数据结构支持的 ListView(或任何 AdapterView),请不要使用 SimpleAdapter。 Foot.inMouth(true);
    【解决方案2】:

    SimpleAdapter 用于静态数据,因此您的性能可能会有所不同。最好的解决方案可能是切换到不同类型的适配器,例如ArrayAdapter,或者每次更改数据集时都创建一个新的SimpleAdapter

    【讨论】:

      【解决方案3】:
      ListView lv= (ListView) findViewById(R.id.loglist);
      ArrayList<Map<String, String>> list = buildData();
      String[] from = { "time", "message" };
      int[] to = { R.id.logtime, R.id.logmessage };
      
      adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to);
      lv.setAdapter(adapter);
      

      每次调用该函数更新ListView。请记住,您必须使用新数据更新 list 变量..

      希望对您有所帮助..:)

      【讨论】:

        【解决方案4】:

        我无法让 notifyDataSetChanged() 来更新我的 SimpleAdapter,因此我尝试首先使用 removeAllViews() 删除所有附加到父布局的视图,然后添加 ListView,这很有效,让我更新用户界面:

        LinearLayout results = (LinearLayout)findViewById(R.id.results);
        ListView lv = new ListView(this);
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.directory_row, 
                            new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept } );
        
        for (...) { 
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", name);
            map.put("dept", dept);
            list.add(map);
        }
        
        lv.setAdapter(adapter);
        results.removeAllViews();     
        results.addView(lv);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-18
          • 2017-04-16
          • 1970-01-01
          • 2014-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多