ListView 简单理解

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

例一,数组作为数据源,填充的是ArrayAdapter
private ListView lv;
@Override
protected 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作为数据源,填充的是SimpleAdapter

private ListView lv;
@Override
protected 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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pluto_Min8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值