• 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来提供列表项。

  • 相关阅读:
    wepack使用
    js 原型链
    react 生命周期
    settimeout--原来定时器是有三个及以上参数的
    我所未知的 typeof 现象
    js 里面的 function 与 Function
    ECMAScript 对象类型
    js阻碍DOM加载
    面试问题与心得
    Java IO 乱码
  • 原文地址:https://www.cnblogs.com/vonzc/p/10440555.html
Copyright © 2020-2023  润新知