Android创建列表并为列表添加数据

在Android开发中经常会用到ListView,也就是列表,而列表的内容需要如何决定呢,很好的方法是使用各种adapter

首先来看看用entries添加列表内容

在布局文件中,创建一个ListView,其内容在values文件夹下的arrays.xml文件中

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/books"  
    android:divider="#f00"
    android:dividerHeight="2px"
    android:headerDividersEnabled="false"/>

entries为ListView中的内容;divider为分隔条颜色;dividerHei为分隔条高度

资源文件arrays.xml如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>11111111</item>
        <item>22222222</item>
        <item>33333333</item>
        <item>44444444</item>
    </string-array>
</resources>

这样就完成了一个简单的ListView,该列表的内容是存在另一个xml文件中的。

接下来是ArrayAdapter的使用,ListView布局文件与上面一致,除了没有entries参数,因为是使用adapter,MainActivity.java代码如下

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView list1 = (ListView) findViewById(R.id.list1);
        String arr1[] = { "111", "222" ,"333" };
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
                (this, R.layout.array_item, arr1);
        list1.setAdapter(adapter1);
    }
}

以上代码创建了一个ArrayAdapter并为它配置了几个参数,其中arr1很明显就是创建的那个数组里的数据,
而R.layout.array_item是ListView里的数据的样式,array_item的内容如下

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/TextView"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="24dp"
    android:padding="10px"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2"
    />

这个文件里只有一个TextView,而TextView里并未设置内容android:text,而是设置了一堆样式,比如字体大小,阴影之类的
这样在app运行后看到的ListView里的数据的样式就与这个TextView里的一致。

ListActivity的使用
让Activity直接继承ListActivity,这样无需布局界面就可以得到一个列表的界面,代码如下

public class MainActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String arr[] = { "111", "222" ,"333" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this, R.layout.support_simple_spinner_dropdown_item, arr);
        setListAdapter(adapter);
    }
}

可以看到以上代码中没有setContentView方法,也就是没有使用布局界面,因为ListActivity本身就是一个列表型的界面

ArrayAdapter的每个列表项只能是TextView,接下来使用可以自定义的BaseAdapter
布局文件只有一个ListView,并且只进行了简单的设置

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<ListView
    android:id="@+id/mylist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

Java代码如下

public class MainActivity extends Activity {
    ListView myList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myList = (ListView) findViewById(R.id.mylist);
        BaseAdapter adapter = new BaseAdapter() {
            @Override
            public int getCount() {
                return 40;
            }

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

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

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                LinearLayout line = new LinearLayout(MainActivity.this);
                line.setOrientation(LinearLayout.HORIZONTAL);
                ImageView image = new ImageView(MainActivity.this);
                image.setImageResource(R.mipmap.ic_launcher);
                TextView text = new TextView(MainActivity.this);
                text.setText("第" +(position +1 )+"个列表项" );
                text.setTextSize(20);
                text.setHighlightColor(Color.RED);
                line.addView(image);
                line.addView(text);
                return  line;
            }
        };
        myList.setAdapter(adapter);
    }
}

 

BaseAdapter提供了几个方法来改变列表的显示,比如getCount方法表示数量,getView方法为列表设置了样式

接下来是一个可以展开的列表组件,ExpandableListView,一个ExpandableListView组件的参数没有太多,这里不给出
布局文件的代码,下面是Java文件的代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ExpandableListAdapter adapter = new BaseExpandableListAdapter() {
            int[] logos = new int[]{
                    R.mipmap.ic_launcher,
                    R.mipmap.ic_launcher,
                    R.mipmap.ic_launcher
            };
            private String[] armTypes = new String[]{
                    "1和10之间","10和20之间","20和30之间"
            };
            private String[][] arms = new String[][]{
                    {"1","2","3","4"},
                    {"11","12","13","14"},
                    {"21","22","23","24"}
            };

            private TextView getTextView(){
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textView = new TextView(MainActivity.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
                textView.setPadding(36,0,0,0);
                textView.setTextSize(20);
                return textView;
            }

            @Override
            public int getGroupCount() {
                return armTypes.length;
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                return arms[groupPosition].length;
            }

            @Override
            public Object getGroup(int groupPosition) {
                return armTypes[groupPosition];
            }

            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return arms[groupPosition][childPosition];
            }

            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }

            @Override
            public boolean hasStableIds() {
                return true;
            }

            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                LinearLayout ll = new LinearLayout(MainActivity.this);
                ll.setOrientation(LinearLayout.VERTICAL);
                ImageView logo = new ImageView(MainActivity.this);
                logo.setImageResource(logos[groupPosition]);
                ll.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }

            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition,childPosition).toString());
                return textView;
            }

            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }
        };
        ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list);
        expandListView.setAdapter(adapter);
    }
}

ExpandableListView的显示内容由ExpandableListAdapter接口提供,想要实现这个接口就需要扩展
BaseExpandableListAdapter。代码中可以看到BaseExpandableListAdapter有很多个方法,其中几个比较
重要的方法有:

getGroupCount(),这个方法返回的是组列表项的数量
getGroupView(), 这个方法会返回一个View,来成为组列表项的样式
getChildrenCount(),每一列展开后的列表数量
getChildView(),每一列展开后的样式

最后来看看Spinner,这是一个列表选择框,点击后会看见列表的内容,选择其中一个会显示出来
布局文件如下

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       />

Java代码如下:

public class MainActivity extends AppCompatActivity {
    Spinner spinner;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner = (Spinner) findViewById(R.id.spinner);
        String[] arr={"444","555","666"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.support_simple_spinner_dropdown_item, arr);
        spinner.setAdapter(adapter);
    }
}

spinner使用ArrayAdapter来提供列表项。

posted on 2019-02-26 22:08  vonzc  阅读(1257)  评论(0编辑  收藏  举报