如何从具有多个数组的对象创建列表视图

3

我又迷失了方向。我的目标如下:

public class LogInfo implements Serializable{


public ArrayList<Point[][]> strokes;
public LinkedList<byte[]> codes;
public int[] times;

...
}

首先,我从一个包含这些对象的ArrayList中填充ListView。然后,我从ListView中选择一个对象,并希望在新片段中填充具有字段的新列表。

public ArrayList<Point[][]> strokes;
public LinkedList<byte[]> codes;

然而,为了创建一个ArrayAdapter,我不能只是将一个对象传递给它(就我的理解)。我需要传递一个数组。问题是,我想先创建和选择一个对象,然后从它的字段中填充列表(不仅仅是笔画或代码,而是二者都有)。

我的ObjectAdapter类应该如何编写,并且应该扩展哪个类?为了从包含多个对象的ArrayList中选择一个对象,我使用了以下代码:

public class LogInfoObjectAdapter extends ArrayAdapter<LogInfo>

示例(现实生活):

我停车场有很多汽车,需要列出它们的清单,所以我使用ArrayAdapter来填充列表。在我从列表中选择一辆汽车(汽车对象)之后,它有两个数组(例如坏灯泡和坏轮胎,但两个数组大小相同)。现在我想用所选汽车的信息填充新列表。我希望这已经足够清楚了。我的问题是,要使用ArrayAdapter,我必须在构造函数中传递一个数组,但我想传递整个对象,并在我的适配器类内部处理它并将选择的字段添加到ListView中。


请查看:如何使用ArrayAdapter<myClass> - Paresh Mayani
Paresh Mayani,这不是我要找的,我已经按照你发布的答案做了。现在我需要将所选对象中的字段加载到新列表中。也许通过一个示例会更清楚。我更新了我的问题。 - Marek
2个回答

1
如果您有一个包含多个列表的对象,您不需要扩展 ArrayAdapter ,只需扩展 BaseAdapter 并实现所需的方法( getCount() getView()等)。
public class Adapter extends BaseAdapter {

class LogInfo implements Serializable {


    public ArrayList<Point[][]> strokes;
    public LinkedList<byte[]> codes;
    public int[] times;
}

private LogInfo mInfo;
public Adapter(LogInfo info) {
    mInfo = info;
}



@Override
public int getCount() {
    if (mInfo != null && mInfo.strokes != null) {
    return mInfo.strokes.size();
    }
    return 0;
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if (mInfo != null) {
    Point[][] p = mInfo.strokes.get(i);
    byte[] b = mInfo.codes.get(i);
    //create the view
    }
    return null;
}

}


你能否提供更多关于如何遍历我在BaseAdapter构造函数中传递的对象的信息?我从未使用过它。我在构造函数中传递了LogInfo对象(而不是数组)。先行致谢。 - Marek
谢谢,我的解决方案与你的有点不同,但我理解了。 - Marek

0

1) Array adapter有一个getItem()方法,您可以使用它按索引获取特定项。 2) 让您的LogInfo实现IIterable接口http://developer.android.com/reference/java/lang/Iterable.html

public class LogInfo implements Serializable, Iterable<Point[][]>{


public ArrayList<Point[][]> strokes;
public LinkedList<byte[]> codes;
public int[] times;

public abstract Iterator<Point[][]> iterator (){

//Iterator implementation

}

现在你可以直接在具有以下签名的其他列表中使用此对象。
public class LogInfoObjectAdapter extends ArrayAdapter<Point[][]>

Greensy,你认为BaseAdapter怎么样? - Marek
为什么需要基础适配器?您想在一个列表中显示不同类型的数据吗? - Artem Zelinskiy
之前的答案是关于BaseAdapter的。现在我有点困惑了。我只想从第一个列表(在第一个Fragment中)选择一个对象,然后在新的Fragment中创建另一个列表,并显示其两个数组的信息。顺便说一下,你为什么要扩展ArrayAdapter<Point[][]>?我想访问对象的所有字段,而不仅仅是笔画。 - Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接