ListView 简单理解

来源:互联网 发布:好身材的女明星 知乎 编辑:程序博客网 时间:2024/05/22 02:44

ListView(列表视图)

使用步骤

  1. 在布局xml文件声明listview控件
  2. 在java代码找到listview控件设置数据适配器,继承BaseAdapter
  3. getCount()确定listview里面有多少个条目
  4. getView(int position) 返回某个位置要显示的view对象
  5. View.inflate() 打气筒 可以把xml文件转成view显示

ListView视图控件

列表信息很多时候,滑动起来很慢,这时listview有个属性android:fastScrollEnabled="true"//快速滑动

适配器.:就是把一些数据在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表, 数据库,集合等

常用适配器 ArrayAdapterSimpleAdapter 他们都是继承于 BaseAdapter

一般对于前两个适配器,他们的数据来源无非就是String[]或者List 。下面我们列举两个例子:

ArrayAdapter(数组适配器)作为纯文本,单一内容时使用。List

例一,数组作为数据源,填充的是ArrayAdapterprivate ListView lv;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    lv = (ListView) findViewById(R.id.lv);    String[] objects = new String[]{"Animation","App","content","Media","NFC","OS"};// 传入字符串内容    lv.setAdapter(new ArrayAdapter<String>(this, // 赋值 ArrayAdapter定义泛型<String>(参数1:context,    R.layout.item,//参数2:自定义布局,    objects));  //参数3:String[]数组内容);}

SimpleAdapter()作为图片和文本时使用,List

例二:List作为数据源,填充的是SimpleAdapterprivate ListView lv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);    lv = (ListView) findViewById(R.id.lv);    List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();// List<Map<String,Object>>,进行图片文字显示    Map<String, Object> map1 = new HashMap<String, Object>();// 在ListView显示一行内容    map1.put("icon", R.drawable.ic_menu_preferences);    // 绑定图片    map1.put("name", "功能设置");    // 绑定文字内容    data.add(map1);    // 添加到List集合里    Map<String, Object> map2 = new HashMap<String, Object>();    map2.put("icon", R.drawable.ic_menu_recent_history);    map2.put("name", "时钟设置");    data.add(map2);    // 赋值 SimpleAdapter (参数1:context,参数2:自定义布局,参数3:);    lv.setAdapter(new SimpleAdapter(this,    // 赋值 SimpleAdapter (参数1:context,    data, // 参数2:List<Map<String,Object>>名    R.layout.item,     // 参数3:自定义布局     new String[]{"icon","name"},    // 参数4:String[]里放入 Map的key键    new int[]{R.id.iv,R.id.tv}));    // 参数5:int[]里放入 自定义布局里的控件 ImageView 和 TextView}

BaseAdapter(基础适配器)以下是自定义适配器继承 BaseAdapter

// 设置适配器 private class MyAdapter extends BaseAdapter {                    // 获取listView所要显示的次数                    @Override                    public int getCount() {                        return list.size();                    }                    @Override                    public Object getItem(int position) {                        return null;                    }                    @Override                    public long getItemId(int position) {                        return 0;                    }                    // 获得在listView所要显示的内容                    @Override                    public View getView(int position, View convertView, ViewGroup parent) {                        //  此块代码是写入到 XML中 LinearLayout,代码创建布局属性;LinearLayout显示数据有限,数据一旦过多就奔溃                         LinearLayout ll = new LinearLayout(MainActivity.this);                        ll.setOrientation(LinearLayout.HORIZONTAL);                        ll.setGravity(Gravity.CENTER_VERTICAL);                        ImageView iv = new ImageView(MainActivity.this);                        String sex = list.get(position).getSex();                        if ("man".equals(sex)) {                            iv.setImageResource(R.mipmap.ic_launcher);                        } else {                            iv.setImageResource(R.mipmap.ic_launcher);                        }                        TextView tv = new TextView(MainActivity.this);                        tv.setText(list.get(position).getName());                        ll.addView(iv,50,50);                        ll.addView(tv);                        return ll;                    }                });                        // 如果条目多,快速滑动,会出现内存溢出,这时需要复用listView缓存对象(convertView),把用过的条目复用回收                                             TextView tv = null;                        if (convertView == null)  {  // 缓存不存在就创建                            ll = new TextView(MainActivity.this);                        } else { // 存在的话就进行复用回收                            ll = (TextView) convertView;                         }        // View.inflate() 打气筒 可以把xml文件转成view显示,获取控件在liteView里显示        @Override        public View getView(final int position, View convertView, ViewGroup parent) {                        // 用 ListView 显示数据                        View view = null;                        if (convertView == null) {                            // 打气把 item.xml 打气到view                            view = View.inflate(MainActivity.this, R.layout.item, null);                        } else {                            view = convertView;                        }                        // findViewById,前面记得要指明是 View.findViewById() 否则默认是MainActivity.findViewById(),获取控件信息会出错                        ImageView image = (ImageView) view.findViewById(R.id.item_image);                        TextView text = (TextView) view.findViewById(R.id.item_text);                        Student student = list.get(position);                        String sex = student.getSex();                        if ("man".equals(sex)) {                            image.setImageResource(R.mipmap.nan);                        } else {                            image.setImageResource(R.mipmap.nv);                        }                        text.setText(student.getName());                        return view;}

adapter.notifyDataSetChanged(); // 通知数据适配器更新数据,而不是new出来新的数据适配器

例子:    //获取数据库的全部记录,刷新显示数据    private void refreshData() {        list = sql.findAdd();        if (adapter == null) {            adapter = new MyAdapter();            lv.setAdapter(adapter);        } else {            // 通知数据适配器更新数据,而不是new出来新的数据适配器            adapter.notifyDataSetChanged();        }    }
1 0
原创粉丝点击