我和我的同事Joe认为我们已经找到了一种更简单的解决问题的方法。在我们的解决方案中,我们不是扩展BaseAdapter而是扩展ArrayAdapter。
代码如下:
public class CircularArrayAdapter< T > extends ArrayAdapter< T >
{
public static final int HALF_MAX_VALUE = Integer.MAX_VALUE/2;
public final int MIDDLE;
private T[] objects;
public CircularArrayAdapter(Context context, int textViewResourceId, T[] objects)
{
super(context, textViewResourceId, objects);
this.objects = objects;
MIDDLE = HALF_MAX_VALUE - HALF_MAX_VALUE % objects.length;
}
@Override
public int getCount()
{
return Integer.MAX_VALUE;
}
@Override
public T getItem(int position)
{
return objects[position % objects.length];
}
}
所以这里创建了一个名为CircularArrayAdapter的类,它接受一个对象类型T(可以是任何东西)并使用它创建一个数组列表。 T通常是字符串,但也可能是其他任何类型。
构造函数与ArrayAdapter相同,但初始化了一个称为middle的常量。这是列表的中间位置。无论数组的长度如何,MIDDLE都可以用来将ListView居中于列表的中央。
getCount()被重写以返回一个巨大的值,就像上面创建一个很大的列表一样。
getItem()被重写以返回数组上的虚假位置。因此,在填充列表时,列表将以循环方式填充对象。
此时,CircularArrayAdapter仅替换文件中的ArrayAdapter,从而创建ListView。
要使ListView居中,必须在初始化ListView对象后,在创建ListView的文件中插入以下行:
listViewObject.setSelectionFromTop(nameOfAdapterObject.MIDDLE, 0)
使用之前初始化的MIDDLE常量,将视图居中,并使列表的顶部项目位于屏幕顶部。
: ) ~ 祝好,希望这个解决方案有用。
AdapterView
层次结构(例如ListView
),那么波士顿先生的解决方案是唯一可用的选项。 - CommonsWare