如何解决“布局有超过80个视图,不利于性能”?

时间:2013-11-26 17:12:58

标签: android performance android-layout tablerow

我正在做一个有点复杂的布局,只是因为我无法修复由LINT 指示的错误(...有黑莓超过80个视图,对性能不利) 这是布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Activity_schedapunti">


    <TableLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".7"
            android:gravity="center_horizontal"
            android:text="@string/esame_visivo"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:background="@android:color/black"/>

            <TextView 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".3"
            android:gravity="center_horizontal"
            android:text="@string/punteggio_parziale"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:background="@android:color/black"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                 <TextView 
                     android:id="@+id/textview_aspetto"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="@string/aspetto"/>                  
               <TextView 
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="@string/coeff_x1"
                     android:textStyle="bold"
                     android:textColor="@color/light_yellow"/>
               <EditText 
                     android:id="@+id/edittext_aspetto"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:gravity="center_horizontal"
                     android:inputType="number"
                     android:singleLine="true" />
            </LinearLayout>

            <TextView 
                android:id="@+id/textview_puteggio_parziale_aspetto"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>
        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                 <TextView 
                     android:id="@+id/textview_punti_colore"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="@string/colore"/>                   
               <TextView 
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="@string/coeff_x2"
                     android:textStyle="bold"
                     android:textColor="@color/light_yellow"/>
               <EditText 
                     android:id="@+id/edittext_punti_colore"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:gravity="center_horizontal"
                     android:inputType="number"
                     android:singleLine="true" />
            </LinearLayout>

            <TextView 
                android:id="@+id/textview_puteggio_parziale_colore"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:gravity="center_horizontal"
                android:text="@string/esame_olfattivo"
                android:textColor="@android:color/white"
                android:textStyle="bold"
                android:background="@android:color/black"/>

            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".3"
                android:gravity="center_horizontal"
                android:text="@string/punteggio_parziale"
                android:textColor="@android:color/white"
                android:textStyle="bold"
                android:background="@android:color/black"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_intensita"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/intensita"/>                 
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x1"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_intensita"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_intensita"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_complessita"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/complessita"/>                   
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x2"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_complessita"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_complessita"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_qualita"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/qualita"/>                   
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x3"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_qualita"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_qualita"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>




        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:gravity="center_horizontal"
                android:text="@string/esame_gusto_olfattivo"
                android:textColor="@android:color/white"
                android:textStyle="bold"
                android:background="@android:color/black"/>

            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".3"
                android:gravity="center_horizontal"
                android:text="@string/punteggio_parziale"
                android:textColor="@android:color/white"
                android:textStyle="bold"
                android:background="@android:color/black"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_struttura"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/struttura"/>                 
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x1"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_struttura"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_struttura"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_equilibrio"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/equilibrio"/>                
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x1"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_equilibrio"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_equilibrio"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_intensita_gusto_olfattivo"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/intensita"/>                 
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x1"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_intensita_gusto_olfattivo"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_intensita_gusto_olfattivo"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_persistenza"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/persistenza"/>                   
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x2"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_persistenza"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_persistenza"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_qualita_gusto_olfattivo"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/qualita"/>                   
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x3"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_qualita_gusto_olfattivo"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_qualita_gusto_olfattivo"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>


        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> 
            <LinearLayout 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:orientation="horizontal">               
                <TextView 
                    android:id="@+id/textview_punti_armonia"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/armonia"/>                   
                <TextView 
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/coeff_x3"
                   android:textStyle="bold"
                   android:textColor="@color/light_yellow"/>
                <EditText 
                   android:id="@+id/edittext_punti_armonia"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:gravity="center_horizontal"
                   android:inputType="number"
                   android:singleLine="true" />
            </LinearLayout>
            <TextView 
                android:id="@+id/textview_puteggio_parziale_armonia"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center"
                android:layout_weight=".3"/>
        </TableRow>

        <TableRow 
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".7"
                android:gravity="center_horizontal"
                android:text="@string/punteggio_totale"
                android:textColor="@android:color/white"
                android:textStyle="bold"
                android:background="@android:color/black"/>

            <TextView 
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".3"
                android:gravity="center_horizontal"
                android:textColor="@color/light_yellow"
                android:textStyle="bold"
                android:background="@android:color/black"/>
        </TableRow>
    </TableLayout>
</ScrollView>

我读过使用ListView,但我该怎么办?并非所有行都相同,或者在任何情况下中间都有一些元素不等于所有其他行!

图片:

enter image description here

3 个答案:

答案 0 :(得分:3)

这绝对是ListView的好候选人。正如我在评论中所述,您可以在layout中使用自定义Adapter。我不知道你是如何得到它的数据所以我不能确切地说如何检查但是在每一轮getView()你可以检查数据并决定显示哪个View /隐藏。

只需创建layout的{​​{1}}等等,每行可能需要,看起来可能位于水平TextView s的垂直LinearLayout内在LinearLayout内或只是RelativeLayout,然后根据您的需要将visibility更改为visible / gone

如果您不熟悉这样做,那么您可以看到this tutorial这样做。

Adapter Docs

ListView Docs

正如评论中所指出的,如果你的layout有很大不同可能会切换getView(),你可以在Adapter layouts方法中夸大不同的visibility {1}}糟糕的做法。这仅取决于您的数据和layout s。

答案 1 :(得分:0)

哇这很糟糕,使用ListView而不是TableView,并根据你所在的部分动态添加行。

我会扩展BaseAdapter来实现这个目标

答案 2 :(得分:0)

您必须使用MergeAdapter,您可以将不同的适配器合并到一个。例如标题和值。我从StackOverflow获得了代码,但我找不到主题,所以我在这里粘贴我找到的代码。

package com.mydocum.adapters;

import java.util.ArrayList;

import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;

/**
* Adapter that merges multiple child adapters and views into a single
* contiguous whole.
* 
* Adapters used as pieces within MergeAdapter must have view type IDs
* monotonically increasing from 0. Ideally, adapters also have distinct ranges
* for their row ids, as returned by getItemId().
* 
*/
public class MergeAdapter extends BaseAdapter implements SectionIndexer {
    protected ArrayList<ListAdapter> pieces = new ArrayList<ListAdapter>();
    protected String noItemsText;

    /**
    * Stock constructor, simply chaining to the superclass.
    */
    public MergeAdapter() {
        super();
    }

    /**
    * Adds a new adapter to the roster of things to appear in the aggregate
    * list.
    * 
    * @param adapter
    *            Source for row views for this section
    */
    public void addAdapter(ListAdapter adapter) {
        pieces.add(adapter);
        adapter.registerDataSetObserver(new CascadeDataSetObserver());
    }

    /**
    * Get the data item associated with the specified position in the data set.
    * 
    * @param position
    *            Position of the item whose data we want
    */
    public Object getItem(int position) {
        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                return (piece.getItem(position));
            }

            position -= size;
        }

        return (null);
    }

    public void setNoItemsText(String text){
        noItemsText = text;
    }

    /**
    * Get the adapter associated with the specified position in the data set.
    * 
    * @param position
    *            Position of the item whose adapter we want
    */
    public ListAdapter getAdapter(int position) {
        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                return (piece);
            }

            position -= size;
        }

        return (null);
    }

    /**
    * How many items are in the data set represented by this Adapter.
    */
    public int getCount() { 
        int total = 0;

        for (ListAdapter piece : pieces) {
            total += piece.getCount();
        }

        if(total == 0 && noItemsText != null){
            total = 1;
        }

        return (total);
    }

    /**
    * Returns the number of types of Views that will be created by getView().
    */
    @Override
    public int getViewTypeCount() {
        int total = 0;

        for (ListAdapter piece : pieces) {
            total += piece.getViewTypeCount();
        }

        return (Math.max(total, 1)); // needed for setListAdapter() before
                                        // content add'
    }

    /**
    * Get the type of View that will be created by getView() for the specified
    * item.
    * 
    * @param position
    *            Position of the item whose data we want
    */
    @Override
    public int getItemViewType(int position) {
        int typeOffset = 0;
        int result = -1;

        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                result = typeOffset + piece.getItemViewType(position);
                break;
            }

            position -= size;
            typeOffset += piece.getViewTypeCount();
        }

        return (result);
    }

    /**
    * Are all items in this ListAdapter enabled? If yes it means all items are
    * selectable and clickable.
    */
    @Override
    public boolean areAllItemsEnabled() {
        return (false);
    }

    /**
    * Returns true if the item at the specified position is not a separator.
    * 
    * @param position
    *            Position of the item whose data we want
    */
    @Override
    public boolean isEnabled(int position) {
        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                return (piece.isEnabled(position));
            }

            position -= size;
        }

        return (false);
    }

    /**
    * Get a View that displays the data at the specified position in the data
    * set.
    * 
    * @param position
    *            Position of the item whose data we want
    * @param convertView
    *            View to recycle, if not null
    * @param parent
    *            ViewGroup containing the returned View
    */
    public View getView(int position, View convertView, ViewGroup parent) {
        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {

                return (piece.getView(position, convertView, parent));
            }

            position -= size;
        }

        if(noItemsText != null){
            TextView text = new TextView(parent.getContext());
            text.setText(noItemsText);
            return text;
        }

        return (null);
    }

    /**
    * Get the row id associated with the specified position in the list.
    * 
    * @param position
    *            Position of the item whose data we want
    */
    public long getItemId(int position) {
        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                return (piece.getItemId(position));
            }

            position -= size;
        }

        return (-1);
    }

    public int getPositionForSection(int section) {
        int position = 0;

        for (ListAdapter piece : pieces) {
            if (piece instanceof SectionIndexer) {
                Object[] sections = ((SectionIndexer) piece).getSections();
                int numSections = 0;

                if (sections != null) {
                    numSections = sections.length;
                }

                if (section < numSections) {
                    return (position + ((SectionIndexer) piece)
                            .getPositionForSection(section));
                } else if (sections != null) {
                    section -= numSections;
                }
            }

            position += piece.getCount();
        }

        return (0);
    }

    public int getSectionForPosition(int position) {
        int section = 0;

        for (ListAdapter piece : pieces) {
            int size = piece.getCount();

            if (position < size) {
                if (piece instanceof SectionIndexer) {
                    return (section + ((SectionIndexer) piece)
                            .getSectionForPosition(position));
                }

                return (0);
            } else {
                if (piece instanceof SectionIndexer) {
                    Object[] sections = ((SectionIndexer) piece).getSections();

                    if (sections != null) {
                        section += sections.length;
                    }
                }
            }

            position -= size;
        }

        return (0);
    }

    public Object[] getSections() {
        ArrayList<Object> sections = new ArrayList<Object>();

        for (ListAdapter piece : pieces) {
            if (piece instanceof SectionIndexer) {
                Object[] curSections = ((SectionIndexer) piece).getSections();

                if (curSections != null) {
                    for (Object section : curSections) {
                        sections.add(section);
                    }
                }
            }
        }

        if (sections.size() == 0) {
            return (null);
        }

        return (sections.toArray(new Object[0]));
    }

    private class CascadeDataSetObserver extends DataSetObserver {
        @Override
        public void onChanged() {
            notifyDataSetChanged();
        }

        @Override
        public void onInvalidated() {
            notifyDataSetInvalidated();
        }
    }
}

在这里您需要如何使用它:

    MergeAdapter adapter = new MergeAdapter();
AdapterA adapterA = new AdapterA(...);
AdapterB adapterB = new AdapterB(...);

adapter.addAdapter(adapterA);
adapter.addAdapter(adapterB);

listview.setAdapter(adapter);

在列表视图中,您将依次使用adapterA和andapterB并正确淋浴。这两个适配器可以有diffente对象。

再见。