Android05-ListView

1.ListView基础代码

<ListView
        android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ListView listView = (ListView) findViewById(R.id.lv_list);
        listView.setAdapter(new MyAdapter());
    }
    
    public class MyAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			//返回这个ListView中要展示多少条数据
			return 5;
		}

		@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) {
			//返回ListView具体要显示的View
			TextView textView = new TextView(MainActivity.this);
			textView.setText("第" + position + "个TextView");
			return textView;
		}
    	
    }
}

2.ListView的优化

1:代码的优化,在上述ListView基础代码中,当屏幕进行翻滚时,会回收翻上去的TextView,并且创建新的TextView,这样消耗内存。我们可以对其进行优化,让其在内存中只有屏幕所显示的数量的TextView对象,上下翻滚只是对这些对象进行重新的使用。
2:布局页面的优化。
<ListView
    android:id="@+id/lv_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
ListView标签的layout_width、layout_height应该使用match_parent或者传入一个具体的值,这样就不需要进行多次的计算,多次的调用getView方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //返回ListView具体要显示的View
    TextView textView = null;
    if(convertView == null){
        //当convertView为空时,说明没有可以重用,这是就创建TextView对象
        textView = new TextView(MainActivity.this);
    }else {
        //可以重新使用
        textView = (TextView) convertView;
    }
    textView.setText("第" + position + "个TextView");
    return textView;
}

3.ListView复杂布局

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if(convertView == null){
        //将具体的布局文件转化为View对象
        view = View.inflate(MainActivity.this, R.layout.item, null);
    }else {
        view = convertView;
    }
    return view;
}

4.通过LayoutInflater将布局文件转化为对象的三种方式

public void getView1(int position, View convertView, ViewGroup parent){
    //第一种
    LayoutInflater from = LayoutInflater.from(MainActivity.this);

    //第二种 直接获取LayoutInflater
    LayoutInflater layoutInflater = getLayoutInflater();

    //第三种 在安卓远源码中使用
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
}

5.ArrayAdapter

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.lv_list);
    //使用定义好的Adapter -> ArrayAdapter,适用于比较简单的布局中
    String[] objects = {"张三","lisi","wangwu","zhaoliu","fengti"};
    //三个参数的ArrayAdapter,布局只能时用TextView,三个参数分别时上下文环境、布局文件资源的id、要显示的数据
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item1, objects);
    //四个参数的ArrayAdapter,可以使用其他组件之外的一个组件
    //四个参数分别时 上下文环境、布局页面资源id、TextwView资源id、内容
    adapter = new ArrayAdapter<String>(this, R.layout.item2, R.id.tv_text, objects);
    listView.setAdapter(adapter);
}

6.SimpleAdapter

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.lv_view);

    List<Map<String, String>> data = new ArrayList<Map<String, String>>();
    //List中每一个Map都是一条数据
    Map<String,String> map1 = new HashMap<String, String>();
    map1.put("title", "1111111111");
    map1.put("content", "1111111111111");
    data.add(map1);

    Map<String,String> map2 = new HashMap<String, String>();
    map2.put("title", "2222222222");
    map2.put("content", "2222222222222");
    data.add(map2);
    //from和to应该相对应通过 "title"找到R.id.tv_title将数据显示
    String[] from = {"title","content"};
    int[] to = {R.id.tv_title,R.id.tv_content};
    //第一个参数 上下文
    //第二个参数 使用List封装要显示的内容 一个Map装在一个数据
    //第三个参数 布局资源id
    //第四个参数 字符串的数组时Map的key
    //第五个参数 字符串对应的资源id
    SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);

    listView.setAdapter(simpleAdapter);
} 

7.ListView从数据库获取数据

public class MainActivity extends Activity {

    private MyOperHelper myOperHelper;
    private List<Info> list = new ArrayList<Info>();
	private ListView listView;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //获取布局文件
        listView = (ListView) findViewById(R.id.lv_view);
        //数据库的实例
        myOperHelper = new MyOperHelper(this);
    }
    
	/**
	 * 插入数据
	 * @param v
	 */
    public void insert(View v){
    	SQLiteDatabase database = myOperHelper.getReadableDatabase();
    	database.execSQL("insert into info(name,phone) values('王五','13777777')");
    	database.execSQL("insert into info(name,phone) values('zhaoliu','111111')");
    	database.execSQL("insert into info(name,phone) values('tianqi','122222')");
    	database.close();
    }
    
    /**
     * 查询数据,封装List
     * @param v
     */
    public void query(View v){
    	SQLiteDatabase database = myOperHelper.getReadableDatabase();
    	Cursor cursor = database.rawQuery("select * from info", null);
    	while(cursor.moveToNext()){
    		Info info = new Info();
    		info.name = cursor.getString(1);
    		info.phone = cursor.getString(2);
    		list.add(info);
    	}
    	
    	for(Info info : list){
    		System.out.println(info);
    	}
    	
    	//现在有了数据,进行数据于布局文件的适配
    	listView.setAdapter(new MyAdapter());
    }
    
    public class MyAdapter extends BaseAdapter {

    	/**
    	 * 返回数据的总数
    	 */
		@Override
		public int getCount() {
			return list.size();
		}

		/**
		 * 每一个条目所对应的数据
		 */
		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		/**
		 * 条目数
		 */
		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = null;
			if(convertView == null){
				view = View.inflate(MainActivity.this, R.layout.item, null);
			}else {
				view = convertView;
			}
			
			//要通过view对象获取TextView对象,保证TextView是上下翻滚时的最新对象
			TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
			TextView tv_phone = (TextView) view.findViewById(R.id.tb_phone);
			
			//通过position获取List中的数据,并且赋值给TextView
			tv_name.setText(list.get(position).name);
			tv_phone.setText(list.get(position).phone);
			return view;
		}
    	
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值