ListView, Arraylist<objc>,BaseAdapter之间的联系

通常我们在用Listview类时候,Android自带的相关类都不够用,我当初在理解系统自带的简单格式例子的时候都很头痛,我把他们之间的关系做个比喻,好理解多了。

假如我们要做一个联系人的列表

以列表形式显示一系列数据需要用到ListView类,而用列表(LisetView)就需要:

  1. 原始数据————一堆电话号码、姓名、邮箱
  2. 原始数据分组————一个联系人信息包括:电话、姓名、邮箱
  3. 设定数据的显示格式————电话号码跟在姓名后面,邮箱在第二行
  4. 将数据组排列————作为list的其中一项(item)——一个item就是一个联系人
  5. 设定一个适配器(Adapter)————将联系人以某种格式显示在listview里面——适配器可以设定数据的显示格式

那么如何将他们组合到一起,运行在手机里?


我将ListView类比作『饼干盒』。
饼干原料(原始数据)混合发酵成面团(设定数据显示格式),用饼干模具压出小熊形状(分组),烘烤成香喷喷的小熊饼干。但是想要送人的时候显得高大上,还要装在『饼干盒』里,不能随便装,要把烤好的饼干一个个码好,送情人就码出心型
那盒子一歪,心型不就没了么?
对的,所以用一个塑料托盘(适配器)来装,托盘里已经挖好了心型的洞,把一个个洞填上饼干,在把托盘装进饼干盒,就可以送人啦!

所以你看,最后饼干的样子和口味取决于你的原料、和面方式、模具形状和托盘的选择。


看起来好复杂,做饼干也好困难
新手嘛?没关系,android已经写好了一份关于饼干的设备、原料比例、制作流程的说明书,虽然只能做出一个样子口味,但好歹你也会做饼干了

那开头的那个联系人的例子怎么实现?
上面说做个联系人饼干,那么我们就把各个联系人以Arraylist方式串成一字长蛇吧。
新建一个『联系人信息类』:联系人的号码、邮箱、姓名以『联系人格式』串在一起,『联系人格式』是我自定义的,就是告诉系统我这『联系人格式』里有号码、电话、邮箱。
联系人信息放在上图特定的坑里,这一步可以在适配器里完成。坑是在layout.xml里挖出来的
最后把用list.setAdapter(adapter )方法,最终显示在手机屏幕上

这么简单的联系人信息还要我告诉系统怎么排列,这样的简单格式系统不是知道怎么做么?
我只是举个例子,其实联系的人信息可以有很多呢,用自带的格式就不合适了。

那么到底如何写代码?
写代码好烦。。。


MainActivity.java
package com.example.text;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.widget.ListView;

public class MainActivity extends Activity {
	ListView list;
	List<PersonInfo> personInfo;
	PersonInfo pi;
	MyAdapter ma;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		list = (ListView) findViewById(R.id.listView1);
		personInfo = new ArrayList<PersonInfo>();
		pi = new PersonInfo();
		
		//假定有了数据库
		Cursor cur = null;
		while (cur.moveToNext()) {
			String name = cur.getString(cur.getColumnIndex("name"));
			pi.setName(name);
			String phone = cur.getString(cur.getColumnIndex("phone"));
			pi.setPhone(phone);
			String email = cur.getString(cur.getColumnIndex("eamil"));
			pi.setEmail(email);
			personInfo.add(pi);
		}
		cur.close();
		ma = new MyAdapter(this, personInfo);
		list.setAdapter(ma);
		
	}
	

	

}
</pre><pre code_snippet_id="364335" snippet_file_name="blog_20140526_4_7049371" name="code" class="java">
MyAdapter.java

package com.example.text;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
	private Context context;
	private List<PersonInfo> pi;

	public MyAdapter(Context context,List<PersonInfo> pi) {
		super();
		this.context = context;//拿到包含MainActivity的context
		this.pi = pi;//拿到包含<personInfo>的列表的引用类型
	}

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

	@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) {
		// 在这里把拿到到的<PersonInfo>格式的列表数据以row.xml的方式排列在activity_main.xml
		//拿到布局文件。在row.xml定义了一个id,这里就能找到R.layout.row
		//这里不能用setContentView(R.layout.activity_main)拿到布局
		convertView = LayoutInflater.from(context).inflate(R.layout.row,null);
		//拿到控件
		TextView name = (TextView) convertView.findViewById(R.id.tv_name);
		TextView phone = (TextView) convertView.findViewById(R.id.tv_phone);
		TextView email = (TextView) convertView.findViewById(R.id.tv_email);
		//设置控件内容
		name.setText(pi.get(position).getName());
		phone.setText(pi.get(position).getPhone());
		email.setText(pi.get(position).getEmail());
		
		return null;
	}

}

PersonInfo.java

package com.example.text;

public class PersonInfo {
	private String name;
	private String phone;
	private String email;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
}



最后是手写的草稿





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值