如何在同一个ListView中创建两个不同的LinearLayout?

时间:2016-01-22 03:57:19

标签: android listview textview android-arrayadapter

我想在一个ListView中组合两个LinearLayout,它们都有不同的TextView排列。所以最后的样子应该如下:

enter image description here

我用我的代码运行它,但应用程序无法启动。下面是我的代码。

活动类

   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”。所以你对此有什么想法吗?

3 个答案:

答案 0 :(得分:1)

  1. 您应该从 BaseAdapter 而不是 ArrayAdapter 继承您的列表适配器。

  2. 重写适配器的 getView()方法,根据位置对布局进行充气,如下所示。

  3. 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;
    }
    

答案 1 :(得分:0)

您将列表适配器设置了两次

package.json

在这种情况下,当前的适配器是第二个,而不是它们两个 将list.setAdapter(adapter1); list.setAdapter(adapter2); ListView或自定义适配器一起使用即可解决您的所有问题,请查看SimpleAdapter tutorial以了解基本知识,并tutorial了解如何制作多个视图而不仅仅是1.这个 tutorial是关于创建自定义适配器 顺便说一下,我对你的代码和xml布局很少有评论 首先,您的括号不需要2 SimpleAdapter,您可以轻松地以编程方式将其添加到TextView,甚至是YES / NO String[]
第二次,您在TextView适配器中没有使用ViewHolder,这不是一个好习惯,因为每次滚动列表时,它都会创建新视图,尽管它可以使用现有的。

答案 2 :(得分:0)

我已经解决了这个问题。但使用这种方法似乎不太方便。

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)的行数相匹配,即使这些空白字符串在不同的布局中使用。所以它不是那么方便,尤其是当你想要显示这么多数据时。如果这里的某人有比这更简单的方法。随时与我/我们分享。我渴望学习。谢谢!