【问题标题】:Which Adapter to Use - BaseAdapter or ArrayAdapter?使用哪个适配器 - BaseAdapter 或 ArrayAdapter?
【发布时间】:2011-11-19 08:27:09
【问题描述】:

我有一个带有以下多个实例的 JSON 字符串

  1. 姓名
  2. 留言
  3. 时间戳
  4. 个人资料照片网址

我想创建一个 ListView,其中每个列表都包含上述内容。对于这种特殊情况,我需要扩展哪个更好的适配器来创建自定义适配器?

【问题讨论】:

标签: android listview android-arrayadapter baseadapter


【解决方案1】:

我的假设是,在考虑这两种情况之前,您已经将 JSON 字符串解析为对象模型......让我们称这个类为 Profile。

策略 1

一个 ArrayAdapter 有一个重写的 getView(..) 方法就足够了,它会以你希望的方式将你的多个字段连接在一起。

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) {
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      View v;
      // use the ViewHolder pattern here to get a reference to v, then populate 
      // its individual fields however you wish... v may be a composite view in this case
   }
}

对于可能较大的列表,我强烈推荐 ViewHolder 模式: https://web.archive.org/web/20110819152518/http://www.screaming-penguin.com/node/7767

这有很大的不同。

  • 优势 1. 允许您对 ListView 上的每个项目应用复杂的布局。
  • 优势 2。 不需要您操作 toString() 来匹配您的预期显示(毕竟,保持模型和视图逻辑分开绝不是一个糟糕的设计实践)。

策略 2

或者,如果您的代表类上的 toString() 方法已经具有可以显示的格式,您可以使用 ArrayAdapter 而无需覆盖 getView()。

这种策略更简单,但会迫使您将所有内容都粉碎成一个字符串以进行显示。

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles)

【讨论】:

  • 在这种情况下覆盖 BaseAdapter 会增加额外的复杂性,但没有真正的优势。您将必须实现 getCount()、getItemId()、getItem(..) 等,并且会发现您的实现相当样板。
  • @jkschneider - 完美答案。正是我需要使用数组适配器的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多