在ListView中动态添加视图(在本例中为Linear Layout)时出现图形错误

时间:2014-02-04 17:14:35

标签: android android-layout listview android-arrayadapter

主题如何建议,我的目标是直接在ListView加载中动态添加一组视图(在我的例子中将是LinearLayout)。

这意味着所有工作必须在ArrayAdapter getView()方法中完成。

以下是我现在所拥有的:

我想要的是什么:

=====================
Text...    
    content of the child's linear layout 1
    content of the child's linear layout 2
    content of the child's linear layout 3
Text...
Text...
=====================
Text...
    content of the child's linear layout 1
Text...
Text...    
=====================
Text...
    content of the child's linear layout 1
    content of the child's linear layout 2
Text...
Text...    
=====================

我现在拥有的内容:

=====================
Text...    
    content of the child's linear layout 1
    BLANK SPACE
    BLANK SPACE
Text...
Text...
=====================
Text...
    content of the child's linear layout 1
    BLANK SPACE
    BLANK SPACE
Text...
Text...    
=====================
Text...
    content of the child's linear layout 1
    BLANK SPACE
Text...
Text...    
=====================

当您只有一个LinearLayout作为子项添加时,您甚至会添加空白区域。这听起来很奇怪。

以下是我正在使用的代码:

static class ViewHolder {
    protected TextView ADI;
    protected TextView date;
    protected TextView vehicleType;
    protected TextView vehiclePlate;
    protected TextView vehicleCountry;
    protected TextView location;
    protected TextView agents;
    protected LinearLayout infractionRootLayout;
    protected List<LinearLayout> infractionLayoutList;
}

public ArchivioViolazioneAdapter(Activity context,
        List<ViolazioneSynchroViolazioneTO> listOfViol) {
    super(context, R.layout.adapter_archivio_riga, 0, listOfViol);

    this.mContext = context;
    this.listOfViol = listOfViol;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViolazioneSynchroViolazioneTO currentViol = getItem(position);

    View rowView = convertView;
    if (rowView == null)
    {
        // Inflates the layout that will be added to root LL
        LayoutInflater inflater = mContext.getLayoutInflater();
        rowView = inflater.inflate(R.layout.adapter_archivio_riga, null);

        // Creates current viewholder
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.ADI = (TextView) rowView.findViewById(R.id.tv_viol_archivio_number);
        viewHolder.date = (TextView) rowView.findViewById(R.id.tv_viol_archivio_data);
        viewHolder.vehicleType = (TextView) rowView.findViewById(R.id.tv_viol_archivio_vehicle_type);
        viewHolder.vehiclePlate = (TextView) rowView.findViewById(R.id.tv_viol_archivio_vehicle_plate);
        viewHolder.vehicleCountry = (TextView) rowView.findViewById(R.id.tv_viol_archivio_vehicle_country);
        viewHolder.location = (TextView) rowView.findViewById(R.id.tv_viol_archivio_location);
        viewHolder.agents = (TextView) rowView.findViewById(R.id.tv_viol_archivio_agent);

        // Dynamic infraction creation
        final LayoutInflater factory = mContext.getLayoutInflater();
        viewHolder.infractionLayoutList = new ArrayList<LinearLayout>();
        viewHolder.infractionRootLayout = (LinearLayout) rowView.findViewById(R.id.ll_viol_archivio_infraction);

        for (ViolazioneSynchroInfrazioniTO infraction : currentViol.getInfrazioni()) {
            LinearLayout infractionView = (LinearLayout) factory.inflate(R.layout.adapter_archivio_infrazione, null);
            TextView article = (TextView) infractionView.findViewById(R.id.tv_viol_archivio_infraction_article);
            TextView comma = (TextView) infractionView.findViewById(R.id.tv_viol_archivio_infraction_comma);
            TextView description = (TextView) infractionView.findViewById(R.id.tv_viol_archivio_infraction_description);

            article.setText(infraction.getArticolo());
            comma.setText(infraction.getComma());
            description.setText(infraction.getDescrizioneInfrazione());
            description.setMaxLines(2);

                            // IMPORTANT STEP
            // Add to list so with rowView.getTag() the populated infraction list of layout will be automatically loaded
            viewHolder.infractionLayoutList.add(infractionView);

            // Add to root view
            viewHolder.infractionRootLayout.addView(infractionView);
        }

        rowView.setTag(viewHolder);
    }

    // Sets UI object
    ViewHolder holder = (ViewHolder) rowView.getTag();
    holder.ADI.setText(currentViol.getIdentificativoADI().toString());      
    holder.date.setText(DateUtils.formatToHumanDate(currentViol.getDataInizio()));
    holder.vehicleType.setText(currentViol.getVeicolo().getTipo());
    holder.vehiclePlate.setText(currentViol.getVeicolo().getTarga());
    holder.vehicleCountry.setText(currentViol.getVeicolo().getNazione());
    holder.location.setText(currentViol.getToponimo());     
    holder.agents.setText(TextUtils.join(", ", currentViol.getListaMatricoleAgenti()));


    return rowView;
}

这是我用作动态添加视图的锚点的适配器布局中的LinearLayout( ll_viol_archivio_infraction ):

<LinearLayout
    android:id="@+id/ll_viol_archivio_infraction"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:orientation="horizontal" >

    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:contentDescription="@string/dummy_string"
        android:scaleType="fitCenter"
        android:src="@drawable/iv_violation"
        android:padding="2dp" />

</LinearLayout>

编辑: 目前尚不清楚为什么这些观点有这种行为。在我的逻辑中,视图是在第一次创建行时创建的,然后通过 rowView.setTag(viewHolder); 将它们存储在rowView中。因此,当必须再次加载该行时,它将使用 ViewHolder holder =(ViewHolder)rowView.getTag(); 检索已填充的动态并返回它。

EDIT2: 添加了完整的适配器布局

<?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="wrap_content"
    android:orientation="vertical"
    android:padding="5dp" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/iv_viol_archivo_number"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:padding="2dp" />

        <TextView
            android:id="@+id/tv_viol_archivio_number_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/iv_viol_archivo_number"
            android:text="@string/viol_bollettari_2"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_viol_archivio_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_viol_archivio_number_label"
            android:layout_toLeftOf="@+id/tv_viol_archivio_data"
            android:text="@string/dummy_number"
            android:textSize="15sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_viol_archivio_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:layout_alignParentRight="true"
            android:text="@string/dummy_date"
            android:textSize="14sp" />

    </RelativeLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:src="@drawable/iv_car"
            android:padding="2dp" />

        <TextView
            android:id="@+id/tv_viol_archivio_vehicle_type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/dummy_vehicle_type"
            android:textSize="15sp"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:padding="2dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/vehicle_plate_label"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_viol_archivio_vehicle_plate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/dummy_vehicle_plate"
            android:textSize="15sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/minus_separator"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_viol_archivio_vehicle_country"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/dummy_vehicle_country"
            android:textSize="15sp"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_viol_archivio_infraction"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:src="@drawable/iv_violation"
            android:padding="2dp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:src="@drawable/iv_marker"
            android:padding="2dp" />

        <TextView
            android:id="@+id/tv_viol_archivio_location"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:text="@string/dummy_location"
            android:textSize="15sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:contentDescription="@string/dummy_string"
            android:scaleType="fitCenter"
            android:src="@drawable/iv_user"
            android:padding="2dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/viol_agent_list"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_viol_archivio_agent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:text="@string/dummy_agent"
            android:textSize="15sp"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

我自己解决了这个问题。

解决方案非常简单,只是一个拼写错误。

需要做的是将用于创建动态视图的根布局的方向设置为垂直,如下所示:

<LinearLayout
    android:id="@+id/ll_viol_archivio_infraction"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:contentDescription="@string/dummy_string"
        android:scaleType="fitCenter"
        android:src="@drawable/iv_violation"
        android:padding="2dp" />

</LinearLayout>

所以我给动态创作的逻辑是正确。这是因为煽动人们将我的工作用于他们自己的项目。