Android笔记-自定义适配器
16lz
2021-01-24
Android之自定义适配器
当我们需要把数据集按某种规则系列地显示在android屏幕上时,这时候就需要用到listview以及它的适配器了。Adapter是所有适配器的根接口,ListAdapter是Adapter的子接口,BaseAdapter是实现ListAdapter接口的抽象类,那么我们要制定自己的适配器时就需要继承BaseAdapter了,那么它里面有些方法就需要我们去实现了。
int getCount(); 返回条目的总数
Object getItem(int position);
BaseAdapter long getItemId(int i);
View getView(int position, View convertView, ViewGroup parent); 返回当前页面的listView
比较重要的就是getView()方法。
那么我们要把数据显示在适配器上就是在getView()方法里面实现的。自定义适配器有一个好处就是可以对item里的任意组件进行监听。
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 自定义视图ListItemView liv = null;if (convertView == null) {liv = new ListItemView();// 获取list_item布局文件的视图convertView = listContainer.inflate(R.layout.list_item, null);liv.time = (TextView) convertView.findViewById(R.id.time);liv.iv = (ImageView) convertView.findViewById(R.id.head);liv.user = (TextView) convertView.findViewById(R.id.user);liv.place = (TextView) convertView.findViewById(R.id.place);liv.book = (TextView) convertView.findViewById(R.id.book);liv.chat = (Button) convertView.findViewById(R.id.chat);liv.save = (Button) convertView.findViewById(R.id.save);convertView.setTag(liv);} else {liv = (ListItemView) convertView.getTag();}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");sdf.format(new Date());liv.time.setText((sdf.format(new Date())));liv.iv.setBackgroundResource((Integer) listItems.get(position).get("image"));liv.user.setText((String) listItems.get(position).get("user"));liv.user.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, ((TextView) v).getText(), 0).show();}});liv.place.setText((String) listItems.get(position).get("place"));liv.place.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, ((TextView) v).getText(), 0).show();}});liv.book.setText((String) listItems.get(position).get("book"));liv.book.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, ((TextView) v).getText(), 0).show();}});liv.chat.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, ((Button) v).getText(), 0).show();}});liv.save.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, ((Button) v).getText(), 0).show();}});return convertView;}
在应用第一次显示的时候,需要判断conVertView是否null,如果为null就需要进行加载item的布局文件了,这样做可以极大提高性能
,因为之后就不需要重新加载了而是从缓存中取出来即可,然后后面的工作就是把数据显示在item里的组件上。
实现的效果图:
列表项布局文件list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
主界面布局文件activity_main.xml:
自定义适配器MyAdapter.java:
package com.example.mylistview;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.Map;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class MyAdapter extends BaseAdapter {private Context context;private List
MainActivity.java:
package com.example.mylistview;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;private MyAdapter adapter;private List> listItems;private int[] images = { R.drawable.p1, R.drawable.p2, R.drawable.p3, R.drawable.p4, R.drawable.p5, R.drawable.p6,R.drawable.p7, R.drawable.p8, R.drawable.p9, R.drawable.p10 };String[] users = { "邹文雄", "吕达", "贾国庆", "曹开阳", "方晶晶", "冯绍雄", "馒头", "程红星", "邱志敏", "方晓娜" };String[] places = { "德国", "阿斯达", "撒打发", "梵蒂冈", "日本", "美国", "俄罗斯", "弗兰克", "英国", "韩国" };String[] books = { "安徒生童话", "格林童话", "一千零一夜", "金银岛", "吹牛大王奇游记", "童年", "汤姆·索亚历险记", "钢铁是怎样炼成的", "遥远的救世主", "鲁滨逊漂流记","高等数学" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listview = (ListView) findViewById(R.id.list);listItems = getItems();adapter = new MyAdapter(this, listItems);listview.setAdapter(adapter);}private List> getItems() {listItems = new ArrayList>();for (int i = 0; i < images.length; i++) {Map map = new HashMap();map.put("image", images[i]);map.put("user", users[i]);map.put("place", places[i]);map.put("book", books[i]);listItems.add(map);}return listItems;}}
点击下载源码
更多相关文章
- Android中View绘制视图
- Android(安卓)开发:(八)数据适配器 Adapter 篇
- Android(安卓)gallery实现选中放大的效果
- Android开发之百分比布局
- 《解析 Google Android(安卓)DSK-智能手机开发范例手册》.(薛显
- Android线性布局(Linear Layout)
- 对Android(安卓)ListView的理解
- 浅谈Android五大布局——LinearLayout、FrameLayout、AbsoulteLa
- android ViewSwitcher详解