Android基础知识(三)之ListView

本文全面介绍Android ListView组件的使用方法,包括基本配置、优化技巧、数据展示原理及复杂页面的搭建方式,并提供ArrayAdapter与SimpleAdapter的实例应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1  ListView入门

【1】定义Listview在布局中

【2】定义ListView的数据适配器

【3】实现BaseAdapter的getCount()方法和getView()方法

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[1]找到我们关心的控件
        ListView lv = (ListView) findViewById(R.id.lv);
        //[2]显示数据 和其他的普通控件有点区别 数据来源于数据适配器
        lv.setAdapter(new MyListAdapter());    
    }
    //定义listview的数据适配器
      private class  MyListAdapter extends BaseAdapter
      {
    	  //一共有多少条数据需要展示
		@Override
		public int getCount() {
			return 1000000;
		}
		//返回指定position位置对应的对象
		@Override
		public Object getItem(int position) {
			return null;
		}
		//返回position位置对应的ID
		@Override
		public long getItemId(int position) {
			return 0;
		}
		/**
		 * 获取一个View  用来显示listview的数据 会作为listview的一个条目出现
		 * convertView 历史缓存对象
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//第一次没有优化的情况下
//			System.out.println("getView"+position);
//			TextView tv = new TextView(MainActivity.this);
//			tv.setText("哈哈"+position);
//			return tv;
			
			//
			TextView tv;
			if(convertView == null)
			{
				//创建新的View对象
				tv = new TextView(MainActivity.this);
				System.out.println("创建新的View对象----"+position);
			}else
			{
				System.out.println("复用历史缓存对象 对象----"+position);
				tv = (TextView) convertView;
			}
			tv.setText("哈哈"+position);
			return tv;
		}
      }

2 ListView的优化

当快速滚动的时候出现错误:out of memory on a 108-byte allocation

优化方法(在getView()方法中固定写法):

                        TextView tv;
			if(convertView == null)
			{
				//创建新的View对象
				tv = new TextView(MainActivity.this);
			}else
			{
				tv = (TextView) convertView;
                       }
                        tv.setText("哈哈哈呵呵呵"+position);
                       return tv;
补充:ListView的奇怪现象(给出总结:以后再使用ListView的时候,使用填充父窗体,即match_parent,一般宽和高都使用填充父窗体)


3 ListView显示数据的原理

javaweb中的mvc:

m:mode  数据

 v :view  视图

 c :controller  负责把数据展示到jsp中

Android中的mvc:

m:mode  数据(javabean)

 v :view    ListView

 c :controller   adapter:负责把数据展示到jsp中

☆不管是什么Adapter,作用就是把数据展示到ListView上


4 ListView显示复杂页面

线性布局、相对布局都继承着ViewGroup,这就说明ViewGroup可以有自己的孩子

通过一个打气筒(inflate)可以把一个布局转换成一个View对象


5 获取打气筒(inflate)的常见API

public View getView(int position, View convertView, ViewGroup parent) {
			//[1]想办法把我们自己定义的布局转换成一个View对象就可以了
			View view;
			if(convertView==null)
			{
				//创建新的View对象 可以通过打气筒把一个布局资源转换成一个View对象
				//resourse就是布局文件
				//第一种获取打气筒方法☆☆☆☆☆☆
				//view = View.inflate(getApplicationContext(), R.layout.item, null);
				
				//第二种获取打气筒方法☆☆☆☆☆☆
				//view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
				
				//第三种获取打气筒方法☆☆☆☆☆☆
				LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
				view = inflater.inflate(R.layout.item, null);
			}
			else
			{
				//复用历史缓存对象
				view = convertView;
			}	
			return view;
		}

6 ArrayAdapter的使用

    String objects[]={"老张","老方","老黎","老毕","老刘","老韩"};//模拟数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[1]找到我们关心的控件
        ListView lv = (ListView) findViewById(R.id.iv);
        //[2]创建一个arrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item1, R.id.tv_name, objects);
        
        //[3]设置数据适配器
        lv.setAdapter(adapter);

权重的概念:一般使用在线性布局中,就是把宽分成几等份,然后每个TextView占几份


7 SimpleAdapter使用

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[1]找到我们关心的控件
        ListView lv = (ListView) findViewById(R.id.lv);
        //[1.1]准备listview要显示的数据
        List<Map<String, String>> data = new ArrayList<Map<String,String>>();
        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("name", "张飞");
        map1.put("phone", "1388888");
        
        Map<String, String> map2 = new HashMap<String, String>();
        map2.put("name", "赵云");
        map2.put("phone", "110");
        
        Map<String, String> map3 = new HashMap<String, String>();
        map3.put("name", "貂蝉");
        map3.put("phone", "1311187");
        
        Map<String, String> map4 = new HashMap<String, String>();
        map4.put("name", "关羽");
        map4.put("phone", "15567485");
        
        //[1.2]把map加入到集合中
        data.add(map1);
        data.add(map2);
        data.add(map3);
        data.add(map4);
        
        //[2]设置数据适配器  resourse:我们定义的布局文件
        //from:map集合的键值
        SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_phone});
        
        //[3]设置数据适配器
        lv.setAdapter(adapter);
    }

15 把数据库里面的数据查询出来展示到ListView上

//定义listview的数据适配器
    private class MyAdapter extends BaseAdapter
    {

		@Override
		public int getCount() {
			return lists.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view;
			if(convertView==null)
			{
				//创建新的view对象
				view = View.inflate(getApplicationContext(), R.layout.item, null);
			}
			else
			{
				view = convertView;
			}
			//找到控件 用来显示数据
			TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
			TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
			
			//如果显示数据
			Person person = lists.get(position);
			tv_name.setText(person.getName());
			tv_phone.setText(person.getPhone());
			
			return view;
		}
    	
    }









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值