【发布时间】:2018-07-19 20:29:52
【问题描述】:
假设我们有两种不同的列表项设计。
我希望出现在奇数位置的列表项具有第一个设计,而出现在偶数位置的列表项具有第二个设计。
是否可以使用两个 XML 文件和一个 ArrayAdapter 来实现这个目标?
【问题讨论】:
标签: android android-layout listview android-arrayadapter
假设我们有两种不同的列表项设计。
我希望出现在奇数位置的列表项具有第一个设计,而出现在偶数位置的列表项具有第二个设计。
是否可以使用两个 XML 文件和一个 ArrayAdapter 来实现这个目标?
【问题讨论】:
标签: android android-layout listview android-arrayadapter
要自定义每个项目的外观,您可以覆盖 数组中对象的 toString() 方法。或者,创建一个视图 对于除 TextView 之外的每个项目(例如,如果 你想要每个数组项的 ImageView),扩展 ArrayAdapter 类并覆盖 getView() 以返回您想要的视图类型 每个项目。
https://developer.android.com/guide/topics/ui/declaring-layout#AdapterViews
就我个人而言,我只会使用一个 recyclerView.Adapter,你可以很容易地使用那些大量的例子来做到这一点。
【讨论】:
您可以像这样(在 Kotlin 中)循环遍历数组的元素并根据索引扩展不同的布局:
for ((i, item) in list.withIndex()){
val row = if (i % 2 == 0) LayoutInflater.from(context).inflate() // inflate layout 1
else LayoutInflater.from(context).inflate() // inflate layout 2
...
listView.addView(row)
}
其中布局 1 和布局 2 是您的 2 个设计的 xmls
【讨论】:
是的。您只需要根据位置(偶数/奇数)扩展布局。 在您的 arrayadapter 的 getView() 方法中,执行以下操作:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
if (position % 2 == 0) { // is even
convertView = LayoutInflater.from(getContext()).inflate(R.layout.even_layout, parent, false);
} else { // is odd
convertView = LayoutInflater.from(getContext()).inflate(R.layout.odd_layout, parent, false);
}
}
return convertView;
}
【讨论】: