0

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

}

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

4

4 回答 4

5

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

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

于 2012-07-20T18:00:47.930 回答
3

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

然后在 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;
      }
  }
于 2015-02-28T13:59:09.000 回答
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);

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

于 2012-07-20T17:51:12.337 回答
2

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

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

List.addAll(anotherListObject);

尽可能多地创建一个包含所有项目的列表。

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

于 2012-07-20T17:51:48.027 回答