您的位置:首页 > 其它

ListView中常用Adapter

2016-05-15 15:24 405 查看
原创:http://write.blog.csdn.net/mdeditor

1) ArrayAdapter (数组适配器)数据比较简单,布局比较简单(数据只有一行时使用)

List集合里面放String

2) SimpleAdapter 一般适合数据比较复杂,布局比较复杂(有图片有文本)

List集合里面放的是map

3) BaseAdapter 自定义Adapter

4) ……

ArrayAdapter、SimpleAdaper都继承自BaseAdapter同时实现listAdapter接口(listAdapter继承于Adapter)

ArrayAdapter

ArrayAdapter (数组适配器)数据比较简单,布局比较简单(数据只有一行时使用)

List集合里面放String

1、 创建ListView



2、 创建Adapter适配器

(1) context

(2) item view

(3) item data



3、 ListView关联Adapter

Listlist=Arrays.asList(s);

由此方法转换的集合,此集合不能再去改变里面存储的数据(不能再添加或删除的操作)



SimpleAdapter

它实现了ListAdapter接口,对数据有严格的要求.它对应的数据必须为一个List集合 < ?extends Map < String,?>> (List集合里面放的是Map,Map的key为String,值为任意类型数据)表示:List集合里面的泛型类必须是Map或者是Map接口的实现类对象。

SimpleAdapter (
Context context,  //this
List<?extends Map<String,?>>data,//listview中要显示的数据
Int resouse,   //资源文件  布局文件中的id
String[] from,  //data(显示数据)中map里的key
Int[] to)    //布局资源中显示数据view中的id
);
//借助SimpleAdapter对象实现一个ListView应用。




BaseAdapter

BaseAdapter是一个抽象类,次类中提供了一些抽象方法,此类中提供了一些抽象方法(也包括一些具体方法,具体方法都已经在此类中实现了),这些抽象方法通常要交给子类实现,例如我们的ArrayAdapter,SimpleAdapter都继承了此类,并重写了抽象方法。

当官方提供的适配器(ArrayAdapter或者SimpleAdapter或…….)不能满足我们的业务要求时,我们可以自己去定义适配器,直接或者间接的继承BaseAdapter,然后重写抽象方法。

ArrayAdapter适合放简单的一行数据 ,SimpleAdapter里面放的是map(键值对),所以需要自己BaseAdapter创建。

里面的item我们要动态生成,因为我们不知道有多少个item。

自定义adapter案例:

/**自定义适配器*/
class ContactAdapter extends BaseAdapter{
private List<Contact> contacts;
private int resource;
private Context context;
//仿照ArrayAdapter的构造方法
public ContactAdapter(Context context,
int resource,List<Contact> contacts) {
this.context=context;
this.contacts=contacts;
this.resource=resource;
}
/**此方法用户返回数据的个数*/
@Override
public int getCount() {
return contacts.size();
}
/**根据位置返回item对象对应的数据*/
@Override
public Object getItem(int position) {
return contacts.get(position);
}
/**此方法一般返回item的位置*/
@Override
public long getItemId(int position) {
return position;
}
/**返回item对象(包好的饺子)
* 每显示一个item,此方法就会调用一次。
* */
@Override
public View getView(int position,
View convertView, ViewGroup parent) {
Log.i("TAG", "convertView="+convertView);//列表项view控件
//1.item布局对象(饺子皮)
ViewHolder vh=null;
if(convertView==null){
convertView=View.inflate(context, resource, null);
vh=new ViewHolder();//一个老师座位表(座位上放数据)
vh.imageView=(ImageView)convertView.findViewById(R.id.imageView1);
vh.phoneTV=(TextView)convertView.findViewById(R.id.textView1);
vh.nameTV=(TextView)convertView.findViewById(R.id.textView2);
convertView.setTag(vh);
}else{
vh=(ViewHolder)convertView.getTag();
}
//2.item数据(饺子馅)
Contact c=contacts.get(position);
//3.将item数据放到item布局对象上(包饺子)
vh.imageView.setImageResource(c.getPhoto());
vh.phoneTV.setText(c.getPhone());
vh.nameTV.setText(c.getName());
return convertView;//包好的饺子(item)
}
/**借助此类的对象保存item布局对象中的子元素的地址
* 优点:减少findviewbyid的调用次数
* 缺点:内存中又多了几个ViewHolder对象*/
class ViewHolder{
ImageView imageView;
TextView phoneTV;
TextView nameTV;
}
}


MainActivity:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.获得ListView
ListView lsv=(ListView)findViewById(R.id.listView01);
//2.准备数据
List<Contact> contacts=
DBContext.getContacts();
//3.item布局
int resource=R.layout.list_item_3;
//4.构建适配器
ContactAdapter adapter=
new ContactAdapter(this, resource,contacts);
//5.设置适配器
lsv.setAdapter(adapter);
//listview在显示数据时会调用adapter的
//getCount方法获得要显示的item记录的个数,
//然后调用adapter的getView方法获得一个一个的item
//最后将item显示出来。
}
}


Context类:

/**联系人(值对象)
*
* 对象:JavaBean
* |-->值对象(封装数据) :实体Bean (Contact)
* |-->业务处理对象(处理业务逻辑):业务Bean (DBContext)
* |-->流程控制对象(流程控制):Activity
*
* ListView (显示数据)
* ------------------
* Activity (逻辑控制)
* |-->获得ListView
* |-->获得数据
* |-->构建Adapter
* |-->设置Adapter(将Adapter中的数据交给ListView)
* -----------------
* DBContext
* |-->处理数据逻辑(将数据取出来以后封装到List<Contact>)
* -----------------
* SQLite数据库
*
* */
public class Contact {

/**名字*/
private String name;
/**手机号*/
private String phone;
/**头像*/
private int photo;

public Contact(String name,String phone,int photo) {
this.name=name;
this.phone=phone;
this.photo=photo;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public void setPhoto(int photo) {
this.photo = photo;
}
public int getPhoto() {
return photo;
}
@Override
public String toString() {
return "Contact [name=" + name + ", phone=" + phone + "]";
}

}


DBContext:

import java.util.ArrayList;
import java.util.List;
/**借助此类访问数据库,将取到的数据
* 封装到List<Contact>集合*/
public class DBContext {

private static List<Contact> contacts=
new ArrayList<Contact>();
/**假设数据来自数据库*/
static{
contacts.add(new Contact("AA", "139", R.drawable.png_01));
contacts.add(new Contact("AB", "138", R.drawable.png_02));
contacts.add(new Contact("CA", "137", R.drawable.png_03));
contacts.add(new Contact("CA", "136", R.drawable.png_04));
contacts.add(new Contact("DA", "135", R.drawable.png_05));
contacts.add(new Contact("DB", "133", R.drawable.png_06));
contacts.add(new Contact("EA", "134", R.drawable.png_07));
contacts.add(new Contact("FA", "131", R.drawable.png_08));
}
public static List<Contact> getContacts(){
return contacts;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: