问题
I'm doing a layout a bit complex, just that I can't fix the error that is indicated by LINT (...has blackberries than 80 views, bad for performance) This is the layout:
<?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>
I read to use a ListView, but how should I to do? Not all the rows are equal, or in any case there are some elements in the middle which are not equal to all other rows!
Image:
回答1:
This definitely looks like a good candidate for a ListView
. As I stated in my comment, you can use a custom layout
in your Adapter
. I don't know how you are getting your data for it so I can't say exactly how to check but in each round of getView()
you can check the data and decide which View
s to show/hide.
Simply create the layout
with the TextView
s, etc... that each row might need, looks like probably inside of a vertical LinearLayout
with horizontal LinearLayout
s inside or just a RelativeLayout
then change visibility
to visible
/gone
depending on what you need.
If you are unfamiliar with doing this then you can see this tutorial on doing it.
Adapter Docs
ListView Docs
As pointed out in a comment, you could inflate different layout
s in your getView()
method of your Adapter
if you have very different layouts
which may make toggling visibility
a bad approach. This just depends on your data and layout
s.
回答2:
Wow this is bad, use a ListView instead of a TableView and dynamically add rows based on what section you are in.
I would extend BaseAdapter to achieve this
回答3:
you must use a MergeAdapter where you can merge differents adapter to only one. For example titles and values. I got the code from StackOverflow but i can't find the topic so i paste here the code that i found.
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();
}
}
}
Here how you need to use it:
MergeAdapter adapter = new MergeAdapter();
AdapterA adapterA = new AdapterA(...);
AdapterB adapterB = new AdapterB(...);
adapter.addAdapter(adapterA);
adapter.addAdapter(adapterB);
listview.setAdapter(adapter);
In the listview you will have the adapterA and andapterB one after other and shower correcly. The two adapter can have diffente object.
Bye.
来源:https://stackoverflow.com/questions/20223628/how-to-resolve-layout-has-more-than-80-views-bad-for-performance