【问题标题】:Passing Multiple Lists<String> into ArrayAdapter将多个列表<String> 传递到 ArrayAdapter
【发布时间】:2012-07-20 00:40:38
【问题描述】:

我从 Activity 开始:

adapter = new ItemAdapter(Items.this, items, totals);
        setListAdapter(adapter);

现在是 ItemAdapter:

public class ItemAdapter extends ArrayAdapter<String> {

private final List<String> items;
private final List<String> totals;
private final Context context;

public ItemAdapter(Context context, List<String> items,
        List<String> totals) {
    super(context, R.layout.item_row_layout, items);
    this.context = context;
    this.items = items;
    this.totals = totals;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater
            .inflate(R.layout.item_row_layout, parent, false);
    TextView t1 = (TextView) rowView.findViewById(R.id.itemName);
    TextView t2 = (TextView) rowView.findViewById(R.id.itemTotal);

    String s1 = items.get(position);
    t1.setText(s1);

    String s2 = totals.get(position);
    t2.setText(s2);


    return rowView;
}

}

现在我知道问题出在构造函数上,因为直到只允许我传递一个列表,而不是两个。有没有其他方法可以做到这一点?

【问题讨论】:

标签: android list constructor android-arrayadapter


【解决方案1】:

我建议使用SimpleAdapter。以下是如何将您的列表转换为一个 List> (但我建议您在构建单独的列表时只构建一个 List>):

List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map;
int count = items.size();
for(int i = 0; i < count; i++) {
    map = new HashMap<String, String>();
    map.put("name", items.get(i));
    map.put("total", totals.get(i));
    list.add(map);
}

adapter = new SimpleAdapter(this, list, R.layout.item_row_layout, new String[] { "name", "total" }, new int[] { R.id.itemName, R.id.itemTotal });

现在您的nametotal 会自动显示在自己的视图中的一行中,而无需编写自定义适配器。

【讨论】:

  • 这看起来是个好方法。虽然它说构造函数没有定义。
  • 嗯,你可以编辑你正在尝试的问题吗?另外我认为R.layout.item_row_layout 是您想要的布局。我之前在您的问题中没有看到不同的布局。
  • 是的,这是一个错字,布局已修复。
  • 我仍然对为什么没有定义构造函数感到困惑,你能发布一下你是如何以及在哪里创建 SimpleAdapter 的吗?
  • 我准确地发布了您所拥有的内容——当然是正确的布局,并将适配器声明为 SimpleAdapter 而不是 ItemAdapter——或者这就是问题所在?
【解决方案2】:

在构造函数中再添加一个参数——以容纳额外的列表;但是不要在 super 调用中传递那个额外的列表。

然后在 getView 方法中访问第二个列表。 看一下代码:

  public class NotificationsAdapter extends ArrayAdapter<String> {
      private Context context;
      private List<String> list;
      private List<String> listTimeStamp;      

      public NotificationsAdapter(Context context, List<String> resource,List<String> timeResource) {
          super(context, R.layout.notification_list_item, resource);
          this.context = context;
          this.list = resource;
          this.listTimeStamp= timeResource;
      }      

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View rowView = inflater.inflate(R.layout.notification_list_item, parent, false);      

          TextView textViewMessage = (TextView) rowView.findViewById(R.id.text_view_notifications_list_item);
          textViewMessage.setText(list.get(position));      

          ImageView imageView = (ImageView) rowView.findViewById(R.id.logo_notifications_list_item);
          imageView.setImageResource(R.drawable.iconsmall);      

          TextView textViewTimeStamp = (TextView) rowView.findViewById(R.id.time_stamp_notifications_list_item);
          textViewTimeStamp.setText(listTimeStamp.get(position));      

          return rowView;
      }
  }

【讨论】:

    【解决方案3】:

    你为什么不同时加入这两个列表?

    List<String> list1 = new ArrayList<String>();
    a.add("Item 1");
    a.add("Item 2");
    
    List<String> list2 = new ArrayList<String>();
    b.add("Item 3");
    b.add("Item 4");
    
    // Append content of list2 to list1
    list1.addAll(list2);
    

    然后您可以像往常一样使用单个列表创建适配器。

    【讨论】:

    • 在我假设的活动中而不是适配器中执行此操作?
    • @KickingLettuce 您可以在任一位置执行此操作,但如果您在 Activity 中执行此操作,则无需更改 Adapter 构造函数。
    • 你最好在你的Activity上做,是的。
    • 假设两个列表中都有 20 项。这现在可以制作 40 件商品吗?列表位置很重要,因为我根据 0 -20 和 0 - 20 的列表位置设置 TextViews。(因为列表是相关的)一个列表的位置 1 与另一个列表的位置 1 相关)
    • 是的,结果列表将包含两个列表的总和。
    【解决方案4】:

    您有一个选择是更改构造函数以接受 List&lt;List&lt;String&gt;&gt; 而不是 List&lt;String&gt; 然后您必须遍历参数中的所有子列表并将每个元素添加到您的本地对象项。

    另一个可能更直接的解决方案是在将多个列表作为参数发送到构造函数之前合并多个列表。即你可以像这样使用List.addAll()这样的方法

    List.addAll(anotherListObject);
    

    根据需要创建一个包含所有项目的列表。

    另一种选择是使用MergeAdapter that CommonsGuy has created 并慷慨地开源以简化流程,让您创建多个适配器,然后将它们全部合并到一个 MergeAdapter 中,而不用担心合并列表

    【讨论】:

    • 你能多说一下第一个选项并放入代码吗?假设它只有几行,就像我想的那样......
    • 我实际上并没有使用这种方法,但它是我所做的最接近的答案,让我走上了正确的道路。一切都很好,现在正在工作!再次感谢你。投票完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2017-06-12
    • 2016-12-11
    相关资源
    最近更新 更多