Android笔记-自定义适配器
2016-03-18 19:35
387 查看
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里的任意组件进行监听。
在应用第一次显示的时候,需要判断conVertView是否null,如果为null就需要进行加载item的布局文件了,这样做可以极大提高性能
,因为之后就不需要重新加载了而是从缓存中取出来即可,然后后面的工作就是把数据显示在item里的组件上。
实现的效果图:
列表项布局文件list_item.xml:
主界面布局文件activity_main.xml:
自定义适配器MyAdapter.java:
MainActivity.java:
点击下载源码
当我们需要把数据集按某种规则系列地显示在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里的任意组件进行监听。
@Override public 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() { @Override public 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() { @Override public 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() { @Override public void onClick(View v) { Toast.makeText(context, ((TextView) v).getText(), 0).show(); } }); liv.chat.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, ((Button) v).getText(), 0).show(); } }); liv.save.setOnClickListener(new OnClickListener() { @Override public 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"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="2016-03-17 11:20:00" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal" > <ImageView android:id="@+id/head" android:layout_width="80dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/p1" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="2" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/user" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="邹文雄" android:textColor="#FFD700" android:textSize="18dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:text="在" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal" > <TextView android:id="@+id/place" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="综合楼" android:textColor="#808080" android:textSize="18dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:text="取走了" /> </LinearLayout> <TextView android:id="@+id/book" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="遥远的救世主" android:textColor="#ff0000" android:textSize="18dp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_weight="1" android:orientation="vertical" > <Button android:id="@+id/chat" android:layout_width="match_parent" android:layout_height="35dp" android:background="#87CEEB" android:text="私信" android:textSize="18dp" /> <Button android:id="@+id/save" android:layout_width="match_parent" android:layout_height="35dp" android:layout_marginTop="10dp" android:background="#87CEEB" android:text="收藏" android:textSize="18dp" /> </LinearLayout> </LinearLayout> </LinearLayout>
主界面布局文件activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="详情列表:" android:textSize="20dp" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
自定义适配器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<Map<String, Object>> listItems;
private LayoutInflater listContainer;
public final class ListItemView {
public TextView time;
public ImageView iv;
public TextView user;
public TextView place;
public TextView book;
public Button chat;
public Button save;
}
public MyAdapter(Context context, List<Map<String, Object>> listItems) {
this.context = context;
this.listItems = listItems;
this.listContainer = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listItems.size();
}
@Override
public Object getItem(int i) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int i) {
// TODO Auto-generated method stub
return 0;
}
@Override public 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() { @Override public 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() { @Override public 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() { @Override public void onClick(View v) { Toast.makeText(context, ((TextView) v).getText(), 0).show(); } }); liv.chat.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, ((Button) v).getText(), 0).show(); } }); liv.save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, ((Button) v).getText(), 0).show(); } }); return convertView; }
}
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<Map<String, Object>> 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 = { "安徒生童话", "格林童话", "一千零一夜", "金银岛", "吹牛大王奇游记", "童年", "汤姆·索亚历险记", "钢铁是怎样炼成的", "遥远的救世主", "鲁滨逊漂流记", "高等数学" }; @Override protected 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<Map<String, Object>> getItems() { listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < images.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); 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中服务的生命周期与两种方式的区别
- android动画详解二 属性动画原理
- Android属性动画
- Android通讯录数据库介绍与基本操作(增删改查)
- Android系统将内置滤镜功能
- Android 知识体系
- android socket实现文件导出功能
- 搭建高质量的Android项目框架系列四
- 关于SQLite在Android开发中的知识点总结
- Android 线程模型
- 复习android 的大喇叭~~~
- 搭建高质量的Android项目框架系列三
- Android遇到No external storage available
- 搭建高质量的Android项目框架系列二
- bug_ _ android.view.WindowManager$BadTokenException: Unable to add window -- token
- Android 的画布Canvas和画笔Paint
- android日志打印代码 logcat
- 搭建高质量的Android项目框架系列一
- Android Studio Gradle Configuration Errors总结
- Android Studio Gradle Configuration Errors总结