簡體   English   中英

如何在同一個ListView中創建兩個不同的LinearLayout?

[英]How to create two different LinearLayout in a same ListView?

我想在一個ListView中合並兩個LinearLayout,兩者都具有不同的TextView排列。 因此,最終外觀應如下所示:

在此處輸入圖片說明

我用我的代碼運行它,但該應用程序無法啟動。 下面是我的代碼。

活動課

   public class MainActivity extends Activity  {

    // Create list of items
    String[] publicModeItems = {
            "AAAAA", 
            "BBBBB"
    };

    String[] publicModeParameters = {
            "YES", 
            "NO"
    };

    String[] publicModeResetExe = {
            "CCCCC",
            "DDDDD"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        populateListView();
    }

    private void populateListView() {

        CustomList adapter1 = new CustomList(this, publicModeItems, publicModeParameters);

        // Build adapter
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(
                this,                       // context for the activity
                R.layout.text_view_test,    // layout to use (create)
                publicModeResetExe);        // items to display

        // Configure the list view
        ListView list = (ListView) findViewById(R.id.PublicModeListView);
        list.setAdapter(adapter1);
        list.setAdapter(adapter2);
    }

    private class CustomList extends ArrayAdapter<String> {
        private final Activity context;
        private final String[] publicModeItems;
        private final String[] publicModeParameters;

        public CustomList(Activity context, 
                String[] publicModeItems, 
                String[] publicModeParameters) {
            super(context, R.layout.text_views_1, publicModeItems);
            this.context = context;
            this.publicModeItems = publicModeItems;
            this.publicModeParameters = publicModeParameters;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            LayoutInflater layoutinflater = context.getLayoutInflater();
            View rowView = layoutinflater.inflate(R.layout.text_views_1, null, true);
            TextView txtPublicModeItems = (TextView) rowView.findViewById(R.id.PublicModeItems);
            TextView txtPublicModeParameters = (TextView) rowView.findViewById(R.id.PublicModeParameters);
            txtPublicModeItems.setText(publicModeItems[position]);
            txtPublicModeParameters.setText(publicModeParameters[position]);

            return rowView;
        }
    }
}

text_views_1 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/PublicModeLayoutForTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/PublicModeItems"
        android:layout_width="200sp"
        android:layout_height="wrap_content"
        android:textColor="@drawable/text_color_change" />

    <TextView
        android:id="@+id/PublicModeOpenBracket"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="["
        android:textColor="@drawable/text_color_change" />

    <TextView
        android:id="@+id/PublicModeParameters"
        android:layout_width="100sp"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:textColor="@drawable/text_color_change" />

    <TextView
        android:id="@+id/PublicModeCloseBracket"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="]"
        android:textColor="@drawable/text_color_change" />

</LinearLayout>

text_view_test xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textColor="@drawable/text_color_change" >

</TextView>

activity_main xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/PublicModeListViewLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/black"
    android:baselineAligned="true"
    android:orientation="vertical"
    tools:context="com.example.mycalendar.MainActivity" >

    <LinearLayout
        android:id="@+id/PublicModeListViewLayout02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@drawable/custom_border"
        android:padding="5dp" >

        <ListView
            android:id="@+id/PublicModeListView"
            android:layout_width="308dp"
            android:layout_height="wrap_content"
            android:choiceMode="singleChoice"
            android:listSelector="@color/yellow"
            android:smoothScrollbar="true" >

        </ListView>

    </LinearLayout>
</LinearLayout>

問題 :我現在只運行我的代碼,僅顯示“ CCCCC”和“ DDDDD”。 那么您對此有任何想法嗎?

  1. 您應該從BaseAdapter而不是ArrayAdapter繼承列表適配器。

  2. 重寫適配器的getView()方法以根據位置膨脹布局,如下所示。

 public View getView(int position, View convertView, ViewGroup parent) { ... View rootView = null; if (position == 0 || position == 1) { rootView = layoutinflater.inflate(R.layout.text_views_1, null, true); } else { rootView = layoutinflater.inflate(R.layout.text_views, null, true); } ... return rootView; } 

您兩次設置列表適配器

list.setAdapter(adapter1);
list.setAdapter(adapter2);

在這種情況下,當前適配器是第二個,而不是兩個都適配器。
ListViewSimpleAdapter或自定義適配器一起使用,可以解決所有問題,請查閱SimpleAdapter 教程以了解基礎知識,而本教程則了解如何制作多個視圖而不是僅包含1個視圖。本教程是關於創建自定義適配器的順便說一句,我對您的代碼和xml布局的評論很少
首先 ,您的支架不需要2個TextView ,您可以輕松地以編程方式將它們添加到String[]甚至是YES / NO TextView
其次 ,您沒有在CustomList適配器中使用ViewHolder ,這不是一個好習慣,因為每次滾動列表時,它都會創建新視圖,盡管它可以使用已經存在的視圖。

我已經解決了這個問題。 但是使用此方法似乎不太方便。

public class PublicModeActivity extends Activity {

    // Create list of items
    String[] publicModeItems = {
            "AAAAA", 
            "BBBBB"
    };

    String[] publicModeParameters = {
            "YES", 
            "NO"

    String[] publicModeResEx = {
            "",
            "",
            "CCCCC",
            "DDDDD"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        populateListView();
    }

    private void populateListView() {

        CustomList adapter = new CustomList(this, publicModeItems, publicModeParameters, publicModeResEx);

        // Configure the list view
        ListView list = (ListView) findViewById(R.id.PublicModeListView);
        list.setAdapter(adapter);
    }

    private class CustomList extends BaseAdapter {
        private final Activity context;
        private final String[] publicModeItems;
        private final String[] publicModeParameters;
        private final String[] publicModeResEx;

        public CustomList(Activity context, 
                String[] publicModeItems, 
                String[] publicModeParameters,
                String[] publicModeResEx) {
            super();
            this.context = context;
            this.publicModeItems = publicModeItems;
            this.publicModeParameters = publicModeParameters;
            this.publicModeResEx = publicModeResEx;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            LayoutInflater layoutinflater = context.getLayoutInflater();
            View rowView = null;
            Log.i("PublicModeActivity", "" + position);
            if (position < 2) {
                rowView = layoutinflater.inflate(R.layout.text_views_1, null, true);
                TextView txtPublicModeItems = (TextView) rowView.findViewById(R.id.PublicModeItems);
                TextView txtPublicModeParameters = (TextView) rowView.findViewById(R.id.PublicModeParameters);
                txtPublicModeItems.setText(publicModeItems[position]);
                txtPublicModeParameters.setText(publicModeParameters[position]);
            } else {
                rowView = layoutinflater.inflate(R.layout.text_view_test, null, true);
                TextView txtPublicModeResEx = (TextView) rowView.findViewById(R.id.PublicModeResEx);
                txtPublicModeResEx.setText(publicModeResEx[position]);
            }
            return rowView;
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }
    }
}

我需要放置空白字符串"",以使行數與上層布局( text_views_1 )相匹配,即使這些空白字符串用於不同的布局中也是如此。 因此,它並不是很方便,尤其是當您要顯示很多數據時。 如果有人在這里有比這簡單得多的方法。 隨時與我/我們分享。 我渴望學習。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM