android之自定义适配器实现ListView
来源:互联网 发布:乐器管子价格淘宝 编辑:程序博客网 时间:2024/06/04 19:04
距离上篇的博客的发表,已经有好几天了。由于最近在忙着毕业答辩的事,一直抽不出时间来继续写,今晚忙完论文的事,一时,激情来临,所以又提笔。好了,转到正文,这次我讲述怎么样来自定义适配器来实现ListView。首先在我讲解怎么操作之前,我要讲解下,系统自带的适配器的工作原理,因为我觉得,只有了解了适配器的工作原理,我们写起来才不会一片茫然。
解释适配器工作原理前,我们来看下,系统自带适配器的自带的常用方法。
getCount () //得到listview所要显示的总数目
getItem(int position)//得到第position条条目对象
getItemId(int position)//返回其当前条目的当前ID
View getView (int position, View convertView, ViewGroup parent)//得到当前条目的view
系统自带的适配器,其实是先调用getCount()来得到一共要显示多少条条目,然后根据当前的屏幕的宽高和控件的宽高计算得到每屏要显示几条条目。然后调用getView方法,把要显示的数据绑定到指定的控件上,并显示在屏幕上,所以我们重写getView方法时,要做的内容也是一样的,要找到指定的控件和数据,然后把数据绑定到指定的控件上,这里我们会用到一个LayoutInflater(布局填充符),它的作用是把xml的数据转换成一个view,这个大家等下看下代码大概就知道什么意思了。
所以当我们要使用自定义的适配器时,我们就需要重写这个两个方法。当然,我们不是自己真正的去重新写一个类,而是去继承BaseAdapter类,这个类是系统给我们提供的,它要求我们必须要重写上面的四个方法。其他的步骤跟上次使用系统自带的适配器来实现listview是一样的,我现在用自定义适配器来实现上次一样的的效果。
首先是main.xml添加一个listviw控件。
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listview"
/>
</LinearLayout>
然后在layout下list_item.xml条目文件
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:paddingRight="100dip"
android:textSize="30dip"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dip"
android:layout_toRightOf="@id/name"
android:layout_alignTop="@id/name"
android:paddingLeft="100dip"
android:id="@+id/telephone"
/>
</RelativeLayout>
添加类InfoAdapter并继承BaseAdapter
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
publicclass InfoAdapterextends BaseAdapter {
private List<HashMap<String, Object>>data;//要绑定的数据
privateintresource;//要绑定的那个控件的xml的ID
private LayoutInflaterinflater;
public InfoAdapter(Context context,List<HashMap<String,Object>> data,int resource) {
this.data = data;
this.resource = resource;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicint getCount() {//得到listview所要显示的总数目
returndata.size();
}
@Override
public Object getItem(int position) {//得到第position条条目对象
returndata.get(position);
}
@Override
publiclong getItemId(int position) {//返回其当前条目的当前ID
return position;
}
@Override
public View getView(int position, ViewconvertView, ViewGroup parent) {//得到当前条目的view
/*
* 判断是否是否是第一次加载,因为getview会在第一次加载时
* 把其对象全部new出来
*/
if(convertView==null){//判断是否存在view
convertView=inflater.inflate(resource,null);//根据Id,找到其所在的xml,将其转换成view对象
}
//由view对象找到指定的控件
TextView name = (TextView)convertView.findViewById(R.id.name);
TextView telephone = (TextView)convertView.findViewById(R.id.telephone);
//由position找到要绑定的数据,position为当前条目的id
HashMap<String, Object> hashMap =data.get(position);
//将要绑定的数据绑定到指定的控件上
name.setText(hashMap.get("name").toString());
telephone.setText(hashMap.get("tel").toString());
returnconvertView;
}
}
然后在主Activity中加入如下代码
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
publicclass CustomAdapterActivityextends Activity {
/** Calledwhen the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView =(ListView)findViewById(R.id.listview);
//生成动态数组,加入数据
List<HashMap<String,Object>> itemview =new ArrayList<HashMap<String,Object>>();
for (int i = 0; i < 10; i++) {
HashMap<String,Object> hashMap =new HashMap<String, Object>();
hashMap.put("name","csk");
hashMap.put("tel", 110+i+"");
itemview.add(hashMap);
}
InfoAdapter cAdapter =new InfoAdapter(this,itemview,R.layout.list_item);//生成自定义适配器
listView.setAdapter(cAdapter);
listView.setOnItemClickListener(newOnItemClickListener() {
@Override
publicvoidonItemClick(AdapterView<?> parent, View view,
int position,long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"第"+(position+1)+"条数据", Toast.LENGTH_LONG).show();
}
});//添加响应事件
}
}
其测试结果和上次的测试结果一模一样,这里就不贴出测试结果了。
- android之自定义适配器实现ListView
- android ListView自定义适配器实现
- Android ListView实现方法三(自定义适配器)
- Android 自定义适配器ListView 实现打电话
- Android 自定义ListView系列之适配器模式
- ListView 之 自定义适配器
- android listview系列之自定义的适配器(三)
- Android之自定义适配器
- Android开发之适配器ListView
- android之简单listview适配器
- Android之listview万能适配器
- 自定义ListView适配器并实现监听控件
- 自定义Listview的适配器实现ViewHolder优化
- ListView之自定义适配器的使用
- Android学习ListView自定义布局,适配器BaseAdapter
- Android中的listview的adapter自定义适配器
- Android之自定义实现BaseAdapter(通用适配器一)
- Android之自定义实现BaseAdapter(通用适配器二)
- Linux内核学习四库全书
- UVa:10739 String to Palindrome
- C++ memset memcpy 等价于 C# Array.Clear Array.Copy
- 解决安装pymongo报错 ImportError: cannot import name MongoClient
- servlet 提高性能记录
- android之自定义适配器实现ListView
- 磁盘管理之五
- 平摊分均
- memcached操作分类
- 普通Java工程中调用Hibernate的8个执行步骤(properties做配置文件)
- 在C#调用C++的DLL简析(一)——生成非托管dll
- 【LeetCode】Single Number II
- LeetCode 之 Longest Substring Without Repeating Characters
- DP26树的最大独立子集问题 Largest Independent Set Problem @geeksforgeeks