问题 使用哪个适配器 - BaseAdapter或ArrayAdapter?


我有一个JSON字符串,其中包含以下多个实例

  1. 名称
  2. 信息
  3. 时间戳
  4. 个人资料照片网址

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


7554
2017-11-19 08:27


起源

stackoverflow.com/questions/3349693/... 检查一下。 - Lalit Poptani


答案:


我的假设是你在考虑任何一种情况之前已经将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)

10
2017-11-19 08:29



好的,谢谢:)任何特别的原因? - Harsha M V
在这种情况下,重写BaseAdapter会增加额外的复杂性,而没有任何实际优势。您将必须实现getCount(),getItemId(),getItem(..)等,并且会发现您的实现是相当的样板。 - jkschneider
@jkschneider - 完美答案。正是我需要使用阵列适配器的原因 - Abhinav Gujjar