将多个列表<string>传递给ArrayAdapter </string>

时间:2012-07-20 17:44:15

标签: android list constructor android-arrayadapter

我在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;
}

}

现在我知道问题在于构造函数,因为直到只允许我传递一个List而不是两个List。还有另一种方法吗?

4 个答案:

答案 0 :(得分:4)

我建议使用SimpleAdapter。以下是如何将您的列表转换为一个列表&lt;地图&LT; ...&GT;&GT; (但我建议您在构建单独的列表时只构建一个List&lt; Map&lt; ...&gt;&gt;):

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会自动显示在自己的视图中的一行中,而无需编写自定义适配器。

答案 1 :(得分:3)

在构造函数中再添加一个参数 - 以容纳额外的List;但是,不要在超级电话中传递额外的列表。

然后在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;
      }
  }

答案 2 :(得分:2)

为什么不加入这两个名单?

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);

然后您可以像往常一样创建适配器,只需一个List。

答案 3 :(得分:2)

您拥有的一个选项是更改构造函数以接受List<List<String>>而不是List<String>然后您不必执行this.items = items;,而是必须遍历参数中的所有子列表并将每个元素添加到本地对象项。

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

List.addAll(anotherListObject);

您需要多次制作一个包含所有商品的列表。

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