自定义适配器

1、实现
* 自定义适配器要继承 BaseAdapter 类
* 实现getView() 方法;


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;}}


自定义适配器,继承baseAdapter:


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; // 条目的布局IDprivate 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();}}});}}-----------------------------------------------------------------------

方式二:

主函数入口:

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;}}


自定义适配器:

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);}// 返回的是条目的IDpublic 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);//设置控件集到 convertViewconvertView.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;}}}


配置文件:

<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>

更多相关文章

  1. 直接从数据库里修改桌面图标
  2. Android Realm数据库使用总结及采坑记录
  3. [Android新手学习笔记08]-如何让活动Activity保存临时数据用于恢
  4. Android 常用的控件
  5. Android学习教程之日历控件使用(7)
  6. Android更新页面上的数据的常见三种方法
  7. android倒计时控件示例
  8. android实现发送短信并保存到数据库,同时可以获得发送报告和接收
  9. Android批量插入数据到SQLite数据库

随机推荐

  1. Vue组件的注册与挂载流程; 路由原理与注
  2. 学习流程
  3. 第二周(第十天)练习题 2018年4月1日 16:4
  4. Citrix LSTR 1912 CU2 发布Ubuntu 18.04(
  5. 红帽资深解决方案架构师魏新宇:云原生应用
  6. 基于Go语言构建的万亿级流量大数据平台架
  7. 老男孩上海第一期学员陈雷雷-决心书
  8. 架构师,是否需要写代码?
  9. 企业sudo权限规划详解 (实测一个堆命令搞
  10. 磁盘空间空间不足的原因及表现与解决办法