zoukankan      html  css  js  c++  java
  • 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来提供列表项。

  • 相关阅读:
    流处理 —— Spark Streaming中的Window操作
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.8 提供带注解的限定符元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.7 为自动检测组件提供作用域
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.6 给自动检测组件命名
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.5 在组件中定义bean的元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.4 使用过滤器自定义扫描
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.3 自动检测类和注册bean的定义
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.2 元注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.1 @Component和深层的构造型注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10 类路径扫描和被管理的组件
  • 原文地址:https://www.cnblogs.com/vonzc/p/10440555.html
Copyright © 2011-2022 走看看