笔记41 | Android加载器Adapter的几个练习
来源:互联网 发布:粉尘防护口罩知乎 编辑:程序博客网 时间:2024/06/10 06:54
合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》
地址
http://www.jianshu.com/p/bec0fdbb54ef
目录
- 概念
- ArrayAdapter
- SimpleAdapter
- BaseAdapter
概念
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。
如下图直观的表达了Data、Adapter、View三者的关系:
所有的Adapter一览:
- BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
- ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
- SimpleAdapter有最好的扩充性,可以自定义出各种效果。
ArrayAdapter
列表的显示需要三个元素:
a.ListVeiw 用来展示列表的View。
b.适配器 用来把数据映射到ListView上的中介。
c.数据 具体的将被映射的字符串,图片,或者基本组件。
String[] s = new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P", "Q","R","S","T","U","V","W","X","Y","z"}; private void initView(View v) { ListView listView = (ListView) v.findViewById(R.id.f_l_1); ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,s); listView.setAdapter(listAdapter); listView.setOnItemClickListener(listener); } Message message; private OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("md", "item'position:"+position); } };
SimpleAdapter
simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。
ListView listView; private void initView(View v) { listView = (ListView) v.findViewById(R.id.f2_tv); SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), getData(), R.layout.list_item, new String[] {"title","img","jia"}, new int[]{R.id.item_tv,R.id.item_im,R.id.item_tv2}); listView.setAdapter(simpleAdapter); } private List<Map<String, Object>> getData() { //map.put(参数名字,参数值) List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "摩托罗拉"); map.put("jia", "价格:2000"); map.put("img", R.drawable.moto); list.add(map); map = new HashMap<String, Object>(); map.put("title", "诺基亚"); map.put("jia", "价格:3000"); map.put("img", R.drawable.nuojiya); list.add(map); map = new HashMap<String, Object>(); map.put("title", "三星"); map.put("jia", "价格:4000"); map.put("img", R.drawable.sanxing); list.add(map); return list; }
- item_im:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/item_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_im" android:text="TextView" /> <TextView android:id="@+id/item_tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_im" android:layout_below="@+id/item_tv" android:text="TextView" /> <ImageView android:id="@+id/item_im" android:layout_width="100dp" android:layout_height="50dp" /></RelativeLayout>
BaseAdapter
有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。
private List<Map<String, Object>> mDate; private void initView(View v) { ListView listView = (ListView) v.findViewById(R.id.f_l_3); listView.setAdapter(new MyAdapter()); } public class ViewHolder{ TextView textView; ImageView imageView; Button button; } private List<Map<String, Object>> getDate(){ List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Map<String , Object > map = new HashMap<String, Object>(); map.put("tv", "阿里"); map.put("im", R.drawable.ali); list.add(map); map = new HashMap<String, Object>(); map.put("tv", "腾讯"); map.put("im", R.drawable.tx); list.add(map); map = new HashMap<String, Object>(); map.put("tv", "百度"); map.put("im", R.drawable.baidu); list.add(map); map = new HashMap<String, Object>(); map.put("tv", "京东"); map.put("im", R.drawable.jingdong); list.add(map); return list; } public class MyAdapter extends BaseAdapter{ public MyAdapter() { this.mInflater = LayoutInflater.from(getActivity()); } @Override public int getCount() { return mDate.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } private LayoutInflater mInflater; @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { // holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.list_item2, null); holder.button = (Button) convertView.findViewById(R.id.itm_bt3); holder.imageView = (ImageView) convertView.findViewById(R.id.item_im3); holder.textView = (TextView) convertView.findViewById(R.id.item_tv3); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.imageView.setBackgroundResource((Integer) mDate.get(position).get("im")); holder.textView.setText((String) mDate.get(position).get("tv")); holder.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showInfo(position); } }); return convertView; } } /** * listview中点击按键弹出对话框 */ public void showInfo(int position){ new AlertDialog.Builder(getActivity()) .setTitle("标题") .setMessage(""+(String) mDate.get(position).get("tv")) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); }
- item_im2:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/item_im3" android:layout_width="100dp" android:layout_height="50dp" /> <TextView android:id="@+id/item_tv3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_im" /> <Button android:id="@+id/itm_bt3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定" /></LinearLayout>
我的Android征途
- 笔记41 | Android加载器Adapter的几个练习
- 笔记42 | Android加载器Adapter的深入学习篇
- 笔记43 | Android加载器Adapter的深入学习篇(二)
- Android Adapter 接口中几个方法的研究
- Android Adapter 接口中几个方法的研究
- Android Adapter 接口中几个方法的研究
- Android Adapter 接口中几个方法的研究
- Android学习笔记--自定义Adapter的使用
- Adapter的几个常用子类
- Android学习笔记 - Adapter
- Android笔记之Adapter
- GUI的几个练习~
- android学习笔记 Listview adapter
- Android笔记七.ListView+Adapter
- Android Adapter 源码笔记(1)
- Android Adapter 源码笔记(2)
- Android Adapter 源码笔记(3)
- Android学习笔记之Adapter
- 去掉excel下面不用的空白行
- 关于傅里叶
- 雾霾入侵机房会产生哪些危害?该如何防护?
- 欢迎使用CSDN-markdown编辑器
- 基于RK3399的USB转串口驱动模块的编译
- 笔记41 | Android加载器Adapter的几个练习
- JS 运动基础
- Android studio 代码混淆及打包apk
- Unity UGUI替换Image图片的三种方式
- F7+vue 物理返回键监听使用
- Android apk反编译
- JVM虚拟机
- 2017年第一个Python程序
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十二节--小结,Bootstrap Table之角色管理