020自定义BaseAdapter,然后绑定ListView的最简单例子
2016-02-23 13:44
141 查看
1 首先在drawable/中导入7张图片
2写一个名为activity_item.xml 文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/aa4" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40dp" android:text="name" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="speak" /> </LinearLayout> </LinearLayout> </LinearLayout>
3 编写主xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
4
实现如图所示的3个java文件
4.1 Animal.java
/* * 获取字段 */ package com.example.data; public class Animal { private String aName; private String aSpeak; private int aIcon; public Animal() { super(); } public String getaName() { return aName; } public void setaName(String aName) { this.aName = aName; } public String getaSpeak() { return aSpeak; } public void setaSpeak(String aSpeak) { this.aSpeak = aSpeak; } public int getaIcon() { return aIcon; } public void setaIcon(int aIcon) { this.aIcon = aIcon; } public Animal(String aName, String aSpeak, int aIcon) { super(); this.aName = aName; this.aSpeak = aSpeak; this.aIcon = aIcon; }; }
4.2 自定义适配器 编写AnimalAdapter.java
package com.example.data; import java.util.LinkedList; import com.example.androidtext001.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView.FindListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class AnimalAdapter extends BaseAdapter { private LinkedList<Animal> mData;//注 :1 private Context mContext;// 声明上下文 public AnimalAdapter(LinkedList<Animal> mData, Context mContext) { super(); this.mData = mData; this.mContext = mContext; } @Override public int getCount() {// 设置layout中填充条目的数量 // TODO 自动生成的方法存根 return mData.size(); } @Override public Object getItem(int position) {// 得到相关的数据项的指定位置的数据 // TODO 自动生成的方法存根 // return mData == null ? null : mData.get(position); return null; } @Override public long getItemId(int position) {// 得到相关的行id // TODO 自动生成的方法存根 return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // position指定位置从0开始 // converView是Spinner,listView中每一项(item)要显示的view // parent 父窗体,就是spinner,GridView // TODO 自动生成的方法存根 convertView = LayoutInflater.from(mContext).inflate( R.layout.activiy_item, parent, false); img_icon.setBackgroundResource(mData.get(position).getaIcon());// 设置这个view的背景样式 注:1 text_name.setText(mData.get(position).getaName()); text_speak.setText(mData.get(position).getaSpeak()); return convertView; } } /* * 注: * 1 setBackgroundDrawable的参数为Drawable对象,setBackgroundColor的参数为Color对象, * 比如说Color.Red为红色,或Color.rgb(255,0,0) 来制定一个红色 setBackgroundResource * 的参数为资源ID,比如说R.drawable.icon * 2 ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时 * 非常麻烦 LinkedList采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是 * 查找非常麻烦 要丛第一个索引开始 */
4.3MainActivity.java
/** * 自定义BaseAdapter,然后绑定ListView */ package com.example.androidtext001; import java.util.LinkedList; import java.util.List; import com.example.data.Animal; import com.example.data.AnimalAdapter; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends Activity { private List<Animal> mData; private Context mcontext; private AnimalAdapter mAdapter ; private ListView list_animal; @Override protected void onCreate(Bundle savedInstanceState) { // TODO 自动生成的方法存根 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mcontext = MainActivity.this; list_animal = (ListView) findViewById(R.id.listView1); mData = new LinkedList<Animal>();// mData.add(new Animal("gou", "zhu", R.drawable.aa1)); mData.add(new Animal("2", "2.1", R.drawable.aa2)); mData.add(new Animal("3", "3.1", R.drawable.aa3)); mData.add(new Animal("4", "4.1", R.drawable.aa4)); mData.add(new Animal("5", "5.1", R.drawable.aa5)); mData.add(new Animal("6", "6.1", R.drawable.aa6)); mData.add(new Animal("7", "7.1", R.drawable.aa7)); mAdapter=new AnimalAdapter((LinkedList<Animal>)mData,mcontext);//创建适配器 list_animal.setAdapter(mAdapter); list_animal.setOnItemClickListener(new onitemClickListener());// 创建条目选择监听器 } class onitemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO 自动生成的方法存根 switch (arg2) { case 0: Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1) .show(); break; case 1: Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1) .show(); break; case 2: Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1) .show(); break; case 3: Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1) .show(); break; } } } }
BaseAdapter的优化:
何来使用一个ListView以及自定义一个简单的BaseAdapter,从代码中可以看出比较重要的两个方法:getCount()和getView(),界面上有多少列就会调用多少次getView, 每次都是新inflate一个View,都要进行这个XML的解析,这样会 很浪费资源
BaseAdapter的优化,优化的两点有,复用convertView
ViewHolder重用组件
嘿嘿,getView()会被调用多次,那么findViewById不一样得调用多次,而我们的ListView的Item
一般都是一样的布局,我们可以对这里在优化下,我们可以自己定义一个ViewHolder类来对这一部分
@Override public View getView(int position, View convertView, ViewGroup parent) { // position指定位置从0开始 // converView是Spinner,listView中每一项(item)要显示的view // parent 父窗体,就是spinner,GridView // TODO 自动生成的方法存根 // convertView = LayoutInflater.from(mContext).inflate( // R.layout.activiy_item, parent, false); AnimalViewHolder holder; if (convertView == null) {// convertView是系统提供给我们的可供服用的View 的缓存对象 convertView = LayoutInflater.from(mContext).inflate( R.layout.activiy_item, parent, false); holder = new AnimalViewHolder(); holder.img_icon = (ImageView) convertView .findViewById(R.id.imageView1); holder.txt_name = (TextView) convertView .findViewById(R.id.textView1); holder.txt_speak = (TextView) convertView .findViewById(R.id.textView2); convertView.setTag(holder);// 将holder存储到convertView中 } else { holder = (AnimalViewHolder) convertView.getTag(); } holder.img_icon.setBackgroundResour b6bd ce(mData.get(position).getaIcon());// 设置这个view的背景样式 holder.txt_name.setText(mData.get(position).getaName()); holder.txt_speak.setText(mData.get(position).getaSpeak()); return convertView; } } class AnimalViewHolder { ImageView img_icon; TextView txt_name; TextView txt_speak; }
表头表尾分割线的设置:
listview作为一个列表控件,他和普通的列表一样,可以自己设置表头与表尾:以及分割线,可供我们设置的属性如下:
footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条,默认为true
headerDividersEnabled:是否在headerView(表头)前绘制一个分隔条,默认为true
divider:设置分隔条,可以用颜色分割,也可以用drawable资源分割
dividerHeight:设置分隔条的高度
addHeaderView(View v):添加headView(表头),括号中的参数是一个View对象
addFooterView(View v):添加footerView(表尾),括号中的参数是一个View对象
addHeaderView(headView, null, false):和前面的区别:设置Header是否可以被选中
addFooterView(View,view,false):同上
对了,使用这个addHeaderView方法必须放在listview.setAdapter前面,否则会报错。
设置表头表尾:
1 设置表头表尾布局文件 (以下是表头文件)
view_header.xml(表头)
<?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="vertical" android:gravity="center"> <TextView android:layout_width="match_parent" android:layout_height="48dp" android:textSize="18sp" android:text="表头" android:gravity="center" android:background="#43BBEB" android:textColor="#FFFFFF"/> </LinearLayout>
2 java代码
//动态加载顶部View和底部View final LayoutInflater inflater = LayoutInflater.from(this); View headView = inflater.inflate(R.layout.view_header, null, false); View footView = inflater.inflate(R.layout.view_footer, null, false); //添加表头和表尾需要写在setAdapter方法调用之前!!! list_animal.addHeaderView(headView); list_animal.addFooterView(footView);
注:添加表头表尾后,我们发现positon是从表头开始算的,就是你添加的第一个数据本来的postion是 0,但是此时却变成了1,表头也算
以下常用属性
:
列表从底部开始显示:stackFromBottom
设置点击颜色cacheColorHint
如果你为ListView设置了一个图片作为Background的话,当你拖动或者点击listView空白位置会发现 item都变成黑色了,这是时候我们可以通过这个cacheColorHint将颜色设置为透明:#00000000
隐藏滑动条
我们可以通过设置:android:scrollbars=”none” 或者setVerticalScrollBarEnabled(true);
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories