首页 > 代码库 > android 适配器的简易笔记

android 适配器的简易笔记

(一)、使用ArrayAdapter做适配器:

常用在:Spinner

①设置数据源

②使用ArrayAdapter做适配器,使用方法同Spinner

③ 给ListView对象设置适配器

String[] arrayData = http://www.mamicode.com/{"网络设置", "wifi设置", "蓝牙设置", "网络设置2", "wifi设置2","蓝牙设置2", "网络设置3", "wifi设置3", "蓝牙设置3" };

ArrayAdapter<String> adapter = new ArrayAdapter<String>(

上下文对象:       MainActivity.this,     

布局地址 :         android.R.layout.xxx.theme;

数据源:             arrayData);

listView_main_userList.setAdapter(adapter);

listview中每一条item被点击的监听事件

listView_main_userList

.setOnItemClickListener(new OnItemClickListener() {


@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

Object object = parent.getItemAtPosition(position);

System.out.println("==您选择了:==>" + object.toString());

}

});

(二)、使用SimpleAdapter做适配器:

常用在ListView

常用List<Map<String, Object>>接收数据

上下文对象:                      MainActivity.this,                     context

数据源:                             List<Map<String, Object>>        data

布局地址 :                        R.layout.xxx.theme;                       resourse

Map的key[]:                    new String[]{""}                            from

value放在item的位置         new int[]{R.id.xxx}                        to

数据源

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

for (int i = 0; i < 10; i++) {

Map<String, Object> map = new HashMap<String, Object>();

map.put("username", "wxj_" + i);

map.put("password", "123456_" + i);

map.put("email", "wxj@gmail.com_" + i);

list.add(map);

}

SimpleAdapter adapter = new SimpleAdapter(

MainActivity.this,

list,

R.layout.listview_main_userlist,

new String[] { "username" },

new int[] {R.id.text_main_username});

listView_main_userlist.setAdapter(adapter);

// 给ListView增加事件监听器。使用OnItemClickListener来监听ListView中每一个Item。

// 可以通过这个监听器,得到被点击的每个item中的内容(该内容其实就是一个map对象)。

listView_main_userlist

.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// 借助parent中的getItemAtPosition()方法,传进一个位置参数,

// 就能获取到被点击的那个item的对象。该对象其实就是当初加入适配器中的map对象。

Object object = parent.getItemAtPosition(position);

System.out.println("==您点击了:==>" + object.toString());

}

});

(三)、自定义Adapter :BaseAdapter

常用在:给ListView或GridView设置适配器对象。

class MyAdapter extends BaseAdapter {

     public int getCount() {

return imageId.length;

     }

    public Object getItem(int position) {

return imageId[position];

    }

    public long getItemId(int position) {

return position;

    }

   public View getView(int position, View convertView, ViewGroup parent) {

ImageView imageView = null;

//convertView属于移出到屏幕外的容器

如果convertView被装载,证明将加载新数据,所以可以利用这个容器

        if (convertView != null) {    

    imageView = (ImageView) convertView;}

  else{

imageView = new ImageView(MainActivity.this);

        }

// setImageResource()方法是设置ImageView对象中的图片

       imageView.setImageResource(imageId[position]);

       return imageView;

}

(四),较复杂的自定义适配器:

1、新的类:(布局填充器对象)

①    LayoutInflater:

from(Context context)    

Obtains the LayoutInflater from the given context.

作用是:从当前上下文环境中获得一个布局填充器对象;

View   inflate(int resource, ViewGroup root)   

Inflate a new view hierarchy from the specified xml resource. 

作用是:通过填充一个特定的xml布局文件,形成一个view对象。

②   重写getView()方法。


  public View getView(int position, View convertView, ViewGroup parent) {

 方法一: 

 当ListView或GridView中每个item的布局很简单,则无需为item写布局文件

 ImageView imageView = null;

 if (convertView == null) {

 imageView = new ImageView(MainActivity.this);

    } else {

 imageView = (ImageView) convertView;

 }

 imageView.setImageResource(imageId[position]);

 return imageView;

方法二

 当每个item的布局较复杂的时候,借助LayoutInflater来填充布局文件。

View view = null;

if (convertView == null) {

LayoutInflater是依靠from方法产生的

LayoutInflater mInflater = LayoutInflater.from(context);

 调用布局填充器的填充方法,将自定义的item布局文件填充成view对象。

view = mInflater.inflate(R.layout.item_listview_main, null);

 依次将item中的控件find出来。注意此时findViewById的对象不是activity对象,

 而是每个item中的view对象。因此要view.findViewById()

text_item_username = (TextView) view.findViewById(R.id.textView_item_username);

text_item_password = (TextView) view.findViewById(R.id.textView_item_password);

imageView_item_headpic = (ImageView) view.findViewById(R.id.imageView_item_headpic);

} else {

 将移出到屏幕外的view再次利用,也就是充分重复利用convertView

view = convertView;

}

 从数据源中一一获取到每个item控件中应该赋予的数值

String username = (String) list.get(position).get("username");

String password = (String) list.get(position).get("password");

int id = imageId[position];

 给item中每个控件一一赋值

text_item_username.setText(username);

text_item_password.setText(password);

imageView_item_headpic.setImageResource(id);

return view;


方法三

当每个item的布局较复杂的时候,借助LayoutInflater来填充布局文件。 

利用ViewHolder来包装每个item中的控件。

该方法要再写一个内部类,习惯性大家将其命名为ViewHolder:

class ViewHolder {

public TextView text_item_username;

public TextView text_item_password;

public ImageView imageView_item_headpic;

}


 ViewHolder holder = null;

 if (convertView == null) {

 holder = new ViewHolder();

 LayoutInflater mInflater = LayoutInflater.from(context);

 convertView = mInflater.inflate(R.layout.item_listview_main, null);


holder.imageView_item_headpic = (ImageView) convertView .findViewById(R.id.imageView_item_headpic);

holder.text_item_password = (TextView) convertView.findViewById(R.id.textView_item_password);

holder.text_item_username = (TextView) convertView.findViewById(R.id.textView_item_username);

 convertView.setTag(holder);

} else {

 holder = (ViewHolder) convertView.getTag();

 }

 String username = (String) list.get(position).get("username");

 String password = (String) list.get(position).get("password");

int id = imageId[position];

 holder.imageView_item_headpic.setImageResource(id);

 holder.text_item_username.setText(username);

 holder.text_item_password.setText(password);

 return convertView;

}

        虽然第三种方法有些复杂,但是第二种方法中有个漏洞,



android 适配器的简易笔记