我有一个有两列的自定义ListView Adaper。它接受一个ArrayList并在两列中填充其内容。 我的适配器类就像这样
public class myAdapter extends ArrayAdapter<String []> {
private final Activity activity;
private final ArrayList<String []> myArray;
public myAdapter(Activity activity,ArrayList<String[]> arraylist){
super(activity,R.layout.customListview,arraylist);
this.activity = activity;
this.myArray = arraylist;
}
@Override
public View getView(final int position,View view, ViewGroup parent){
LayoutInflater inflater = activity.getLayoutInflater();
View rowView = inflater.inflate(R.layout.customListview, null, true);
if (position < (myArray.size()/2)){
textview1.setText(myArray.get(position*2)[0]);
textview2.setText(myArray.get((position*2)+1)[0]);
}
else {
LinearLayout listRow = (LinearLayout)rowView.findViewById(R.id.listRow);
listRow.setVisibility(View.GONE);
textvew1.setVisibility(View.GONE);
textvew2.setVisibility(View.GONE);
}
return rowView;
}
我的列表视图正确显示内容。但是我的列表视图下面有一个空白区域。我认为它是用列表项填充null元素,用于传递的数组的大小。因为我在两列中显示我的数组的内容,所以我需要listview的大小只是我的数组的一半。有什么建议? 提前致谢。This happens if i pass array with 2 elements
这是customListview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listRow"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:layout_weight="0.5"
android:layout_width="0sp"
android:layout_height="match_parent"
android:textAlignment="center"
android:id="@+id/text1"
android:layout_marginRight="10dp"/>
<TextView
android:layout_weight="0.5"
android:layout_width="0sp"
android:layout_height="match_parent"
android:textAlignment="center"
android:id="@+id/text2"
android:layout_marginLeft="10dp"/>
</LinearLayout>
答案 0 :(得分:1)
只需覆盖适配器中的getCount()并设置列表长度
@Override
public int getCount() {
return myArray.size() / 2;
}
答案 1 :(得分:1)
正如@nbaroz在他的回答中提到的,你应该覆盖getCount()并根据myArray内部的内容返回一个自定义值。此外,似乎因为您只希望ListView包含两行,所以您应该只从getCount()返回2。这样它总是只有两个单元格。
根据我的描述,您正在尝试创建类似于Play商店的布局;你有几行,每行有几个单独的列。这可以通过仅一个数据结构(ArrayList或LinkedList)来完成,以使设计更容易。您可以通过使数据结构长度为要显示的行数(这比硬编码值更好)来实现。数据结构内部的项目将是自定义对象类型,其中包含填充每行内部列所需的数据。
示例自定义ListView项目对象:
public class MyCustomRowObject {
public Column column1;
public Column column2;
public Column column2;
public Column getColumn1() {
return column1;
}
public Column getColumn2() {
return column2;
}
public Column getColumn3() {
return column3;
}
在getView(...)中,您将获得MyCustomRowObject的引用,并创建包含该行列的各个视图的自定义列表项。列表项膨胀后,使用MyCustomRowObject引用中的数据填充视图数据字段并返回列表项。中提琴!
另请注意
这会产生大量开销,使所有这些视图膨胀,因此如果您有任何滚动屏幕的内容,您肯定会想要使用视图回收模式。就个人而言,即使我没有很多列表数据,我也总是会使用回收模式,因为它可以让它在未来证明。