Android 如何防止具有两列的ListView绘制到传递的ArrayList的大小(防止填充空项)?

Android 如何防止具有两列的ListView绘制到传递的ArrayList的大小(防止填充空项)?,android,listview,arraylist,Android,Listview,Arraylist,我有一个自定义的ListView适配器,它有两列。它接受ArrayList并将其内容填充到两列中。 我的适配器类是这样的 public class myAdapter extends ArrayAdapter<String []> { private final Activity activity; private final ArrayList<String []> myArray; public myAdapter(Activity acti

我有一个自定义的ListView适配器,它有两列。它接受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;
}
公共类myAdapter扩展了ArrayAdapter{
私人最终活动;
私有最终数组列表myArray;
公共myAdapter(活动,ArrayList ArrayList){
super(活动,R.layout.customListview,arraylist);
这个。活动=活动;
this.myArray=arraylist;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组父视图){
LayoutInflater充气器=活动。getLayoutInflater();
视图行视图=充气机。充气(R.layout.customListview,null,true);
if(位置<(myArray.size()/2)){
textview1.setText(myArray.get(position*2)[0]);
textview2.setText(myArray.get((position*2)+1)[0]);
}
否则{
LinearLayout listRow=(LinearLayout)rowView.findViewById(R.id.listRow);
setVisibility(View.GONE);
textvew1.setVisibility(View.GONE);
textvew2.setVisibility(View.GONE);
}
返回行视图;
}
我的listview正在正确显示内容。但是我的listview下面有一个空格。我认为它正在使用传递的数组大小的列表项填充null元素。因为我在两列中显示数组的内容,所以我需要listview的大小仅为数组的一半。有什么建议吗? 提前谢谢

下面是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>

只需覆盖适配器中的getCount()并设置列表长度即可

    @Override
    public int getCount() {
        return myArray.size() / 2;
    }
只需在适配器中重写getCount()并设置列表长度

    @Override
    public int getCount() {
        return myArray.size() / 2;
    }

正如@nbaroz在他的回答中提到的,您应该重写getCount(),并根据myArray中的内容返回一个自定义值。此外,由于您只希望ListView包含两行,因此您应该只从getCount()返回2。这样,它将始终只有两个单元格

根据我从您的描述中了解到的情况,您正在尝试创建一个类似于Play store的布局;您有几行,每行中有几列。这只能通过一个数据结构(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引用中的数据填充视图数据字段并返回列表项。Viola

另请注意


这将导致大量开销,使所有这些视图膨胀,因此如果您有任何滚动屏幕的内容,您肯定会希望使用视图回收模式。就个人而言,即使我没有太多列表数据,我也会始终使用回收模式,因为这是未来的证明。

正如@nbaroz在回答您时提到的那样应该重写getCount(),并根据myArray中的内容返回自定义值。此外,由于您只希望ListView包含两行,因此应该只从getCount()返回2。这样,它将始终只有两个单元格

根据我从您的描述中了解到的情况,您正在尝试创建一个类似于Play store的布局;您有几行,每行中有几列。这只能通过一个数据结构(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引用中的数据填充视图数据字段并返回列表项。Viola

另请注意


这将导致大量开销,使所有这些视图膨胀,因此,如果您有任何滚动屏幕的内容,您肯定会希望使用视图循环模式。就个人而言,即使我没有很多列表数据,我也会始终使用循环模式,因为它可以证明将来的情况。

创建具有2个成员的类(value1,value2)假设
MyData
并在适配器中使用它,将ArrayList传递给adapterm,然后通过
position
获取项比此计算更好,并跳过空等其他可能面临的问题。myarray是ArrayList类型,它从某个get请求的结果json对象获取数据。和string[]包含大约7个数据。这就是我使用String ArrayList类型的ArrayList的原因。我注意到您在每个ArrayList项中都托管String[],我的观点是您需要删除以下内容:
myArray.get(position*2)
(myArray.size()/2)
…这样的事情不是很好,解析json数据并将其填充到一个适合您的情况的类中(比如一个包含两个字符串成员的类),然后在适配器中从arraylist读取并简单地使用:
item.getVal1()
item.getVal2()
谢谢你的建议。我会试试的。但我必须修改我的整个项目