【问题标题】:how to resolve "Layout has more than 80 views, bad for performance"?如何解决“布局有超过 80 个视图,对性能不利”?
【发布时间】:2013-11-26 17:12:58
【问题描述】:

我正在做一个有点复杂的布局,只是我无法修复 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,但我应该怎么做?不是所有的行都是相等的,或者在任何情况下中间有一些元素不等于所有其他行!

图片:

【问题讨论】:

  • 你能张贴一张它应该是什么样子的图片吗?这可能会有所帮助。使用ListView,您可以在Adapter 中使用自定义layout,并根据某些值决定显示/不显示某些Views,如果这对您有用。
  • 你想实现什么布局?截图会很好。同样使用这么多视图会减慢您的应用程序
  • @codeMagic 我添加图片 ;)
  • 请看我的回答,您需要扩展基本适配器并根据您所在的部分执行一些条件逻辑以确定要添加多少行

标签: android performance android-layout tablerow


【解决方案1】:

这绝对是ListView 的理想选择。正如我在评论中所说,您可以在您的Adapter 中使用自定义layout。我不知道您是如何获取数据的,所以我无法确切说明如何检查,但在每一轮 getView() 中,您可以检查数据并决定显示/隐藏哪个 Views。

只需使用TextViews 等创建layout,每行可能需要这些...根据您的需要将visibility 更改为visible/gone。

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

Adapter Docs

ListView Docs

正如评论中所指出的,如果您的 Adapter 的 getView() 方法中的 layouts 与 layouts 非常不同,这可能会使切换 visibility 成为一种不好的方法。这仅取决于您的数据和layouts。

【讨论】:

  • 或ListView 也支持多种行类型,而不是显示隐藏,您可以添加对多种行类型的支持并从getView() 膨胀适当的行。
  • 我解决了!!谢谢!!我不知道我是否正确解决了......但是......我通过实现 ListView 解决了
  • 哈哈……不客气!如果您使用ListView 解决了并且它正在工作,那么您可能正确解决了。
  • 对于可见/消失的东西来说这是不好的做法。我认为最好按照@M-WaJeEh 所说的去做
  • @MobileMon 我不确定它有多糟糕。这仅取决于它是如何实现的以及数据是什么样的。我有一个ListView 使用它,因为我有一行显示某些ImageButtons,具体取决于来自服务器的内容。但是,是的,这个建议也应该奏效。关键是自定义View 需要以任何一种方式使用
【解决方案2】:

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

我会扩展 BaseAdapter 来实现这一点

【讨论】:

    【解决方案3】:

    您必须使用 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);
    

    在列表视图中,您将拥有一个接一个的适配器 A 和适配器 B 并正确淋浴。这两个适配器可以有不同的对象。

    再见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多