您的位置:首页 > 移动开发 > Android开发

Android 之 自定义适配器

2014-01-08 10:40 369 查看
[size=large][color=red]自定义适配器
[/color][/size]
[size=medium][color=orange]1、实现
* 自定义适配器要继承 BaseAdapter 类
* 实现getView() 方法;
[/color][/size]

package com.sun.useradapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {

private ListView listView;

// 程序入口
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
List list = getData();
UserAdapter adpter = new UserAdapter(this,list,R.layout.list_item, new String[]{"image","tx1","tx2"},new int[]{R.id.imageView1,R.id.textView1,R.id.textView2});
listView.setAdapter(adpter);

}

// 得到映射的数据
public List<Map<String,Object>> getData(){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map map = new HashMap();
map.put("image",R.drawable.ic_launcher);
map.put("tx1", "我是tx1");
map.put("tx2","我是tx2");
list.add(map);

map = new HashMap();
map.put("image",R.drawable.ic_launcher);
map.put("tx1", "我是tx1");
map.put("tx2","我是tx2");
list.add(map);


return list;
}


}

[size=medium][color=yellow]
自定义适配器,继承baseAdapter:
[/color][/size]

package com.sun.useradapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

/**
* 功能实现:条目上能实现按钮以及复选框的事件
*
* @author Administrator
*
*/

public class UserAdapter extends BaseAdapter {

private Context context;
private LayoutInflater inflater; // 视图容器,其功能和 findViewById();
// 类似,查找布局文件,并实例化对象
private List<Map<String, Object>> list; // 数据容器 , 封装用户传递过来的数据
private int layoutID; // 条目的布局ID
private String from[]; // 数据中的 key -- 该key 对应的值用于显示到对应的控件上
private int to[]; // 控件ID , 和 from 中key 的 value 对应, 实现一一对应的关系

/**
* 用于接收数据,并进行初始化的操作
*
* @param context
* 当前上下文
* @param list
* 数据集
* @param layoutID
* 资源ID ,条目上的
* @param from
* key
* @param to
* key 的 value 对应的控件
*/
public UserAdapter(Context context, List<Map<String, Object>> list,
int layoutID, String[] from, int[] to) {
super();
this.context = context;
this.list = list;
this.layoutID = layoutID;
this.from = from;
this.to = to;
this.inflater = LayoutInflater.from(context); // 获得视图容器对象
}

/**
* 返回 条目数量,根据数据集多少,有多少数据画多少次
*/
public int getCount() {
Log.i("msg", "getCount()...");
return list.size();
}

/**
* 返回当前条目的内容
*/
public Object getItem(int arg0) {
Log.i("msg", "getItem()...");
return list.get(arg0);
}

/**
* 返回条目ID
*/
public long getItemId(int position) {
Log.i("msg", "getItemID()...:" + position);
return position;
}

/**
* 画 条目布局内容,
*/
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("msg", "getView()...当前条目 position:" + position);

if(convertView==null){
convertView = inflater.inflate(layoutID, null); // 将用于布局的资源,进行转换为视图对象
}

// 读取数据 ---
for (int i = 0; i < from.length; i++) {
if(convertView.findViewById(to[i]) instanceof ImageView){
ImageView iv = (ImageView) convertView.findViewById(to[i]); // 初始化一个ImageView 对象
// 设置该对象的相关信息
iv.setBackgroundResource((Integer)list.get(position).get(from[i])); // 设置背景数据

}else if(convertView.findViewById(to[i]) instanceof TextView){
TextView tx = (TextView) convertView.findViewById(to[i]); // 根据资源ID 获取控件对象
tx.setText((String)list.get(position).get(from[i]));
}else{
// 用于扩展
}
}

// 编写事件监听器
addListener(convertView,position); // 指定的控件触发事件
return convertView;
}

/**
* 其余控件的事件监听
* @param convertView
*/
public void addListener(final View convertView,final int position){
Log.i("msg", "addListener()...");

// 按钮点击事件
convertView.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Toast.makeText(context, "按钮触发",1000).show();
TextView x = (TextView) convertView.findViewById(R.id.textView1);
x.setText("我被改变了..");
}
});

// 复选框事件
((CheckBox)convertView.findViewById(R.id.checkBox1)).setOnCheckedChangeListener(new OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if(isChecked){
Toast.makeText(context, "选中了..."+position, 1000).show();
}else{
Toast.makeText(context, "未选中..."+position, 1000).show();
}

}
});
}

}
-----------------------------------------------------------------------

[size=medium][color=olive]方式二:

主函数入口:
[/color][/size]
package com.example.listview_adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Spinner;

public class MainActivity extends Activity {

//声明属性
private ListView lv;
private Spinner spinner;

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

//获取对象
lv = (ListView) findViewById(R.id.lv);
//spinner = (Spinner) findViewById(R.id.spinner);

List<Map<String,Object>> li = this.getData();
UserAdapter adapter = new UserAdapter(li,this);
lv.setAdapter(adapter);
}

/**
* 获取数据源
*/
public List<Map<String,Object>> getData(){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map = null;

map = new HashMap<String,Object>();
map.put("name", "小三");
map.put("age",12);
map.put("btn", R.drawable.ic_launcher);
list.add(map);

map = new HashMap<String,Object>();
map.put("name", "小四");
map.put("age",15);
map.put("btn", R.drawable.ic_launcher);
list.add(map);
Log.i("msg","数据数为:"+list.size());
return list;
}
}


[size=medium][color=green]自定义适配器:[/color][/size]

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
* ListView 的创建,一般要具备两大元素
* 1、数据集,即要映射的字符串、图片信息之类
* 2、适配器,实现把要映射的字符串、图片信息映射成视图(如:TextView Image 等 组件),再添加到ListView中
*
* @author Administrator
*
*/

public class UserAdapter extends BaseAdapter implements OnClickListener {

private List<Map<String,Object>> listItems; //数据集
private Context context; //上下文
private LayoutInflater listContainer; //视图容器

//自定义控件集合
public final class ListItemView{
public Button btn;
public TextView name;
public TextView age;
}

public UserAdapter(List<Map<String, Object>> listItems, Context context) {
super();
this.listItems = listItems;
this.context = context;
listContainer = LayoutInflater.from(context); //创建视图容器工厂,并设置上下文
}

// 返回的是列表条目的个数
public int getCount() {
Log.i("msg", "getCount()...");
return listItems.size();
}

// 返回的是列表条目的内容,根据 位置 在数据中对应查找
public Object getItem(int position) {
Log.i("msg", "getItem()...");
return listItems.get(position);
}

// 返回的是条目的ID
public long getItemId(int position) {
Log.i("msg", "getItemId()...");
return position;
}

/**
* ListView Item 设置
*/
/* (non-Javadoc)
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("msg", "getView()...");
//自定义视图
ListItemView listItemView = null;
if(convertView == null){
Log.i("msg", "converView==null...");
// 新创建一个控件集合对象
listItemView = new ListItemView();

//获取item1 布局文件视图
convertView = listContainer.inflate(R.layout.item1,null);

//获取控件对象
listItemView.age = (TextView) convertView.findViewById(R.id.age);
listItemView.name= (TextView) convertView.findViewById(R.id.name);
listItemView.btn = (Button) convertView.findViewById(R.id.btn);

//设置控件集到 convertView
convertView.setTag(listItemView);

}else{
Log.i("msg", "converView!=null...");
listItemView = (ListItemView) convertView.getTag();
}
Log.i("msg", "设置控件的值....当前position:"+position);
listItemView.age.setText(listItems.get(position).get("age").toString());
listItemView.name.setText(listItems.get(position).get("name").toString());
listItemView.btn.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));
listItemView.btn.setTag(String.valueOf(position)); //设置Tag 标记符
listItemView.btn.setOnClickListener(this); //设置事件
return convertView;
}

// 按钮点击事件
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
Toast.makeText(context, v.getTag().toString()+"值",Toast.LENGTH_LONG).show();
break;
}

}


}


[size=medium][color=blue]配置文件:[/color][/size]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >


<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

</LinearLayout>

ListView 条目上的子项:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名" />

<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄" />

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:focusable="false"
android:text="..." />

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: