android android自定义adapterr 怎样控制listView 条数

16027人阅读
Android(141)
& & & & Android中很多地方使用的是适配器(Adapter)机制,那我们就要好好把这个Adapter利用起来,并且用出自己的特色,来符合我们自行设计的需要喽~~~
& & & & 下面先上一个例子,是使用ViewHolder进行显示效率优化过的工程:
& & & &&package com.test.l
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.app.AlertD
import android.app.ListA
import android.content.C
import android.content.DialogI
import android.os.B
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.B
import android.widget.ImageV
import android.widget.ListV
import android.widget.TextV
/* listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长
* 度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐
* 一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。
* 系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必
* 须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。
* getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的
* 布局。我们用LayoutInflater的方法将定义好的main.xml文件提取成View实例用来显示。然后
* 将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件
* 上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定
* 义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得
* 要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面
* 首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完
* 这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点
* 了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了*/
public class MyListView4 extends ListActivity {
private List&Map&String, Object&& mD
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getData();
MyAdapter adapter = new MyAdapter(this);
setListAdapter(adapter);
private List&Map&String, Object&& getData() {
List&Map&String, Object&& list = new ArrayList&Map&String, Object&&();
Map&String, Object& map = new HashMap&String, Object&();
map.put(&title&, &G1&);
map.put(&info&, &google 1&);
map.put(&img&, R.drawable.i1);
list.add(map);
map = new HashMap&String, Object&();
map.put(&title&, &G2&);
map.put(&info&, &google 2&);
map.put(&img&, R.drawable.i2);
list.add(map);
map = new HashMap&String, Object&();
map.put(&title&, &G3&);
map.put(&info&, &google 3&);
map.put(&img&, R.drawable.i3);
list.add(map);
// ListView 中某项被选中后的逻辑
protected void onListItemClick(ListView l, View v, int position, long id) {
Log.v(&MyListView4-click&, (String) mData.get(position).get(&title&));
* listview中点击按键弹出对话框
public void showInfo() {
new AlertDialog.Builder(this).setTitle(&我的listview&)
.setMessage(&介绍...&)
.setPositiveButton(&确定&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}).show();
public final class ViewHolder {
public ImageV
public TextV
public TextV
public Button viewB
public class MyAdapter extends BaseAdapter {
private LayoutInflater mI
public MyAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
public Object getItem(int arg0) {
// TODO Auto-generated method stub
public long getItemId(int arg0) {
// TODO Auto-generated method stub
public View getView(int position, View convertView, ViewGroup parent) {
// 显示优化(只要之前显示过的就可以不再再次从布局文件读取,直接从缓存中读取——ViewHolder的作用)
// 其实是setTag和getTag中Tag的作用
ViewHolder holder =
if (convertView == null) {// 如果是第一次显示该页面(要记得保存到viewholder中供下次直接从缓存中调用)
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.main, null);
// 以下为保存这一屏的内容,供下次回到这一屏的时候直接refresh,而不用重读布局文件
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.title = (TextView) convertView.findViewById(R.id.title);
= (TextView) convertView.findViewById();
holder.viewBtn = (Button) convertView
.findViewById(R.id.view_btn);
convertView.setTag(holder);
} else {// 如果之前已经显示过该页面,则用viewholder中的缓存直接刷屏
holder = (ViewHolder) convertView.getTag();
holder.img.setBackgroundResource((Integer) mData.get(position).get(
holder.title.setText((String) mData.get(position).get(&title&));
.setText((String) mData.get(position).get(&info&));
holder.viewBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showInfo();
return convertV
& & & & 下面是将自定义的Adapter的构造方法定义为与系统的Adapter一致的工程,这样大家在实例化自定义的Adapter时可以按照实例化系统的Adapter的参数安排来进行哟~
& & & &&package com.test.l
import java.util.L
import java.util.M
import android.app.AlertD
import android.content.C
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.B
import android.widget.CheckB
import poundB
import android.widget.ImageV
import android.widget.TextV
import poundButton.OnCheckedChangeL
* @author Himi
public class MySimpleAdapter extends BaseAdapter {
private LayoutInflater mI
private List&Map&String, Object&&
private int layoutID;
private String flag[];
private int ItemIDs[];
public MySimpleAdapter(Context context, List&Map&String, Object&& list,
int layoutID, String flag[], int ItemIDs[]) {
Log.i(&TAG&,&构造方法&);
this.mInflater = LayoutInflater.from(context);
this.list =
this.layoutID = layoutID;
this.flag =
this.ItemIDs = ItemIDs;
public int getCount() {
// TODO Auto-generated method stub
return list.size();
public Object getItem(int arg0) {
// TODO Auto-generated method stub
public long getItemId(int arg0) {
// TODO Auto-generated method stub
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(layoutID, null);
for (int i = 0; i & flag. i++) {//备注1
if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {
ImageView iv = (ImageView) convertView.findViewById(ItemIDs[i]);
iv.setBackgroundResource((Integer) list.get(position).get(
flag[i]));
} else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {
TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);
tv.setText((String) list.get(position).get(flag[i]));
//...备注2
Log.i(&TAG&,&else&);
addListener(convertView);
return convertV
* 童鞋们只需要将需要设置监听事件的组件写在下面这方法里就可以啦!
* 别的不需要修改!
public void addListener(View convertView) {
((Button)convertView.findViewById(R.id.btn)).setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
new AlertDialog.Builder(LvSimpleAdapter.ma)
.setTitle(&自定义通用SimpleAdapter&)
.setMessage(&按钮成功触发监听事件!&)
Log.i(&TAG&,&Button&);
((CheckBox)convertView.findViewById(R.id.cb)).
setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
new AlertDialog.Builder(LvSimpleAdapter.ma)
.setTitle(&自定义通用SimpleAdapter&)
.setMessage(&CheckBox成功触发状态改变监听事件!&)
Log.i(&TAG&,&CheckBox&);
}& & & & 以上代码的注释都比较详细,而且前面的Blog中也对Adapter进行过讲解,这边就不再说一遍啦~
& & & & 其中第二段代码中没有使用ViewHolder对显示效率进行优化,大家可以参考第一段稍稍改动一下就OK了哈~
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:760516次
积分:7360
积分:7360
排名:第2395名
原创:97篇
转载:105篇
评论:227条
(1)(1)(4)(15)(6)(17)(41)(14)(23)(2)(40)(2)(36)2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。博客访问: 7515820
博文数量: 1490
博客积分: 13501
博客等级: 上将
技术积分: 17833
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Android平台
&&&&使用adpater与listview捆绑后,有时希望在程序使用过程中能动态的更改listview中显示的数据,如何处理?
一、关键代码段
private ListView mListView;
&&&&private Button mBtnChange;
&&&&private android.view.View.OnClickListener mCancelClick;
&&&&private ArrayList<String> mStarNameList = new ArrayList<String>();
&&&&private String[] mAnimalNameList = new String[] {"Dog","Cat","Snake","Duck","Bird"};
&&&&private String[] mStarNameList1 = new String[] {"Kobe","James","Durant","Wade","Love"};
&&&&private ArrayAdapter<String> mAdapter;
&&&&@Override
&&&&protected void onCreate(Bundle savedInstanceState) {
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&setContentView(R.layout.activity_main);
&&&&&&&&this.setCtrlsEventHandler();
&&&&&&&&this.mAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked,mStarNameList);
&&&&&&&&this.mListView = (ListView)findViewById(R.id.listView1);
&&&&&&&&this.mBtnChange = (Button)findViewById(R.id.button1);
&&&&&&&&this.mBtnChange.setOnClickListener(this.mCancelClick);
&&&&&&&&this.mStarNameList.add("Kobe");
&&&&&&&&this.mStarNameList.add("James");
&&&&&&&&this.mStarNameList.add("Durant");
&&&&&&&&this.mStarNameList.add("Wade");
&&&&&&&&this.mListView.setAdapter(this.mAdapter);
&&&&&&&&this.mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
&&&&private boolean mIsMutex = false;
&&&&private void setCtrlsEventHandler()
&&&&&&&&this.mCancelClick = new View.OnClickListener()
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public void onClick(View v)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if(mIsMutex)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&mBtnChange.setText("True");
&&&&&&&&&&&&&&&&&&&&mStarNameList.clear();
&&&&&&&&&&&&&&&&&&&&for(int i=0;i<mAnimalNameList.length;i++)
&&&&&&&&&&&&&&&&&&&&&&&&mStarNameList.add(mAnimalNameList[i]);
&&&&&&&&&&&&&&&&&&&&mAdapter.notifyDataSetChanged();
&&&&&&&&&&&&&&&&&&&&mIsMutex = false;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&mBtnChange.setText("False");
&&&&&&&&&&&&&&&&&&&&mStarNameList.clear();
&&&&&&&&&&&&&&&&&&&&for(int i=0;i<mStarNameList1.length;i++)
&&&&&&&&&&&&&&&&&&&&&&&&mStarNameList.add(mStarNameList1[i]);
&&&&&&&&&&&&&&&&&&&&mAdapter.notifyDataSetChanged();
&&&&&&&&&&&&&&&&&&&&mIsMutex = true;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&};
功能实现主要原理:
&&&&用ArrayList mStarNameList 给Adapter填充数据,再将listview与adapter捆绑。
&&&&当要修改数据时候,只需要对mStarNameList 进行修改,再调用Adapter.notifyDataSetChanged()就可以实现效果。
二、执行效果
参考文献:
阅读(3192) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。继承BaseAdapter实现自定义Adapter - 从不曾离开的只有自由和梦想! - ITeye技术网站
博客分类:
android开发中会经常用来自定义的Adapter,如下就是一个简单的自定义Adapter实例。
import android.app.A
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.BaseA
import android.widget.ImageV
import android.widget.ListV
import android.widget.TextV
import android.widget.T
* 自定义适配器通过ListView显示内容,这个比较重要需要掌握
* @author Dylan
public class CustomAdapterActivity extends Activity {
private ListView mListV
private CustomAdapter mA
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mListView = (ListView) findViewById(R.id.listview);
mAdapter = new CustomAdapter();
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new ItemClickListener());
private final class ItemClickListener implements OnItemClickListener {
// AdapterView&?& parent, --& ListView View view, ---& item int
// position,--& item的数据在Adapter中位置 long id---& item在listView中得位置
public void onItemClick(AdapterView&?& parent, View view, int position, long id) {
String name = (String) mAdapter.getItem(position);
Toast.makeText(getApplicationContext(), "name =" + name + ",position " + position, Toast.LENGTH_SHORT)
private final class CustomAdapter extends BaseAdapter {
private String[] names = new String[] { "无线和网络", "通话设置", "声音", "显示", "位置和安全", "应用程序", "账户与同步", "隐私权",
"SD卡和手机内存", "语言和键盘", "辅助功能", "日期和时间", "关于手机" };
private int[] images = new int[] { R.drawable.image01, R.drawable.image02, R.drawable.image03,
R.drawable.image04, R.drawable.image05, R.drawable.image06, R.drawable.image07, R.drawable.image08,
R.drawable.image09, R.drawable.image10, R.drawable.image11, R.drawable.image12, R.drawable.image13 };
private LayoutInflater mI
public CustomAdapter() {
mInflater = getLayoutInflater();
// 描述adpter的大小(确定了listView的条目)
public int getCount() {
return names.
// Adapter对于的position的数据
public Object getItem(int position) {
return names[position];
// 得到item 在adapter所对应的位置
public long getItemId(int position) {
// 创建listview的item条目,把数据绑定给item int position, Adapter的下标 View
// convertView, 缓存的第一屏item的布局文件 ViewGroup parent ListView
public View getView(int position, View convertView, ViewGroup parent) {
View view =
if (convertView != null) {
view = convertV
view = mInflater.inflate(R.layout.item, parent, false);
ImageView iv_header = (ImageView) view.findViewById(R.id.iv_header);
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
iv_header.setImageResource(images[position]);
tv_name.setText(names[position]);
* @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewCache viewCache =
if (convertView == null) {
viewCache = new ViewCache();
convertView = inflater.inflate(R.layout.folder_list_item, null);
viewCache.tvName = (TextView) convertView.findViewById(R.id.tv_folder_name);
viewCache.ivPreview = (ImageView) convertView.findViewById(R.id.iv_folder_preview);
convertView.setTag(viewCache);
viewCache = (ViewCache) convertView.getTag();
FileInfo fileInfo = arrayList.get(position);
viewCache.tvName.setText(new File(fileInfo.filePath).getName());
return convertV
public static class ViewCache {
public ImageView ivP
public TextView tvN
论坛回复 /
(1 / 3374)
keeponmoving
浏览: 80289 次
来自: 北京
求源码一份 不胜感激
代码没贴全,还不给放源码,你是想分享?
你好,不错的例子,求demo.@qq.co ...
发我一个demo吧,谢谢
您好,非常好的实例,麻烦发一下demo吧,谢谢;3163897 ...}

我要回帖

更多关于 android自定义adapter 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信