文档章节

ListView学习(2)-BaseAdapter 的学习

c
 chuiyuan
发布于 2014/05/09 21:36
字数 1357
阅读 110
收藏 0
点赞 0
评论 0

BaseAdapter

  有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮(确实可以显示)也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

一。要达到的目的 

如上图,在一个ListView 中加入各种数据 。且在点击 button 和  item 时都 有反应,这里,我们就要用到  BaseAdapter(如果用SimpleAdapter ,无法给Btn 加响应) ,并重写它的方法了。

首先是程序的整体架构。

(1)整体架构 

   与ListView  (1)中的相同 ,我们用固定的架构 ,在这里,我们写入部分方法。

public class ListDemo extends Activity {
	private String [] names;   //原始 数据
	private String [] infos ;
	private int [] imgs;
	private List<Map<String ,Object>>listItems ;   //MyAdapter要用的数据格式 
	
	private ListView lv ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listview);
		
		loadData();   //将原始数据转化成MyAdapter  要的格式 
		
		initCtrl();  //完界面初始化与设置
		
		lv.setOnItemClickListener(new OnItemClickListener(){
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id ) {
				// TODO Auto-generated method stub
				Toast.makeText(getBaseContext(), 
						"chat with "+names[position], Toast.LENGTH_SHORT).show();
				
				Intent iChat=  new Intent(getBaseContext() ,Chat.class);
				startActivity(iChat);
			}
		});
	}

	private void initCtrl() {     
		// TODO Auto-generated method stub
		lv =(ListView)findViewById(R.id.listView1);
		
		MyAdapter adapter = new MyAdapter (getBaseContext() ,listItems);
		lv.setAdapter(adapter);
	}

	private List<Map<String, Object>> loadData() {
		// TODO Auto-generated method stub
		 names =new String []{"阿今 ","hwj","twq","isshe"};
		 imgs = new int [] {R.drawable.a1,R.drawable.b  ,R.drawable.c, R.drawable.d};
 		 infos =new String [] {"1988","1992","1993","1994"};
 		 listItems =new ArrayList<Map<String,Object>> ();   //实例化
		 
		 for (int i=0;i<names.length;i++){
			 Map<String ,Object> map = new HashMap<String ,Object>();
			 map.put("name", names[i]);
			 map.put("info", infos[i]);
			 map.put("img", imgs[i]);
			 
			 listItems.add(map);
		 }
		
		return listItems;
	}
}

重点与难点 在于 MyAdapter 的实现 。

(2)  item  的XML 文件 item.xml

类似于这种布局,用相对布局最好实现 。注意,里面为了在加入 Button 后,Item 还能有响应,要取消Button 的焦点,我们用的是

android:focusable="false"

具体如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/name"
        android:layout_below="@+id/name"
        android:layout_marginTop="16dp"
        android:text="info"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@+id/img"
        android:text="name"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ImageView
        android:id="@+id/img"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignBottom="@+id/info"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="15dp"
        android:src="@drawable/a" />

    <Button
        android:id="@+id/btn"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/info"
        android:layout_alignParentRight="true"
        android:layout_marginRight="50dp"
        android:focusable="false"
        android:text="OK" />

  

</RelativeLayout>

(3) MyAdaper文件

    重点在于重写 getView方法,注意,在构造函数 中一定要有context ,否则在后面要用到时没有办法 ,比如下面中的 Button 监听 器里面的。

    下面程序 中,知识 点有: LayoutInflater 的用法,getTag()的用法 ,等。以后用的时候 可以参考 。

public class MyAdapter extends BaseAdapter  {
	private Context context;
	private LayoutInflater inflater ;
	private List<Map<String ,Object>>listItems;

	private class ViewHolder{
		ImageView img;
		TextView name;
		TextView info;
		Button btn;    //控件 的声明 都 在Holder里面
	}

	public MyAdapter(Context context, List<Map<String, Object>> listItems) {
		// TODO Auto-generated constructor stub
		this.listItems=listItems;
		this.context=context;
		inflater= LayoutInflater.from(context);
		//新建 一个扩展布局,Obtains the LayoutInflater from the given context.
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return listItems.size() ;
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return listItems.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		System.out.println("getView " + position + " " + convertView);
		ViewHolder holder;
		/*
         * Recycler(反复循环器):如果convertview 是第一次展示我们就创建新的Holder对象与之绑定,
         * 并在最后通过return convertview 返回,去显示;如果convertview 
         * 是回收来的那么我们就不必创建新的holder对象,只需要把原来的绑定的holder取出加上新的数据就行了 
         */  
		if (convertView ==null){
			convertView= inflater.inflate(R.layout.item, null);   //实例化要扩展的布局
			holder= new ViewHolder();
			holder.img= (ImageView) convertView.findViewById(R.id.img);
			holder.name=(TextView) convertView.findViewById(R.id.name);
			holder.info=(TextView) convertView.findViewById(R.id.info);
			holder.btn= (Button)convertView.findViewById(R.id.btn);		
			convertView.setTag(holder);
			/*Sets the tag associated with this view. A tag can be used to mark 
			 * a view in its hierarchy and does not have to be unique within the hierarchy.
			 *  Tags can also be used to store data within a view without resorting to
			 *   another data structure.
			 */
		}else {
			holder=(ViewHolder) convertView.getTag();
			//将holder  添加到动态生成的View里面
		}
		//数据的设置
		holder.name.setText((CharSequence) listItems.get(position).get("name"));
		holder.info.setText((CharSequence) listItems.get(position).get("info"));
		holder.img.setImageResource((Integer) listItems.get(position).get("img"));
		holder.btn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(context, "bnt clicked", Toast.LENGTH_SHORT).show();
			
			}		
		});
		return convertView;
	}

}





© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 91
码字总数 40993
作品 0
海淀
view-ListView学习

LiastView网上有很多,推荐如下: 1、android ListView详解: http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 2、Android中ListView的性能问题 http://android.tgbus.com/A......

工作日 ⋅ 2011/12/27 ⋅ 0

Android软件开发之ListView 详解 (十一)

Android软件开发之ListView 详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6636139 ListView的使用方法 ListView...

晨曦之光 ⋅ 2012/03/07 ⋅ 0

Android软件开发之ListView 详解 (十一)

Android软件开发之ListView 详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6636139 ListView的使用方法 ListView...

彭博 ⋅ 2012/03/09 ⋅ 0

listview与adapter用法

一个ListView通常有两个职责: (1)将数据填充到布局。 (2)处理用户的选择点击等操作。 第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非...

ARESXIONG ⋅ 2015/11/03 ⋅ 0

Android listview与adapter用法

一个ListView通常有两个职责。 (1)将数据填充到布局。 (2)处理用户的选择点击等操作。 第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非...

OScoder2 ⋅ 2014/03/04 ⋅ 0

一个android记事本的学习过程记录! (二)

在实现了保存文字的功能以后,接下来我们要实现在主页面中的ListView中显示出我们已经保存了的信息;既然要用ListView,则一定要有一个适配器adapter去添加内容,我们新创建一个MyAdapter去继...

小白杨啦啦 ⋅ 2016/05/01 ⋅ 0

Android Browser学习十 快捷菜单模块: PieMenu的实现(2)

前面说的这些东西其实都是重写view实现view的自由绘制, 但是有些时候, 可能我们还需要这样一种自定义的view, 他们其实 不能称得上是view, 而只是一些对视图的描述, 这很像我们使用animator的...

SuShine ⋅ 2014/03/28 ⋅ 0

Android 尝试着重写ImageButton之后,ImageButton不停的自动初始化了

刚刚学习安卓不久,想利用一个Fragment,ListView等组件构建一个UI程序。 不知道为什么程序启动之后,显示正常,但是发现自己重写的一个ImageButton对象不停的在初始化。 一部分的代码如下:...

wangzong ⋅ 2013/12/13 ⋅ 1

学习Android闹钟源代码(三)-AlarmClock类分析(part2)

接上一篇博文:``继续分析AlarmClock类的各个方法: 还是先从简单的开始吧: (1)updateAlarm(),代码如下: private void updateAlarm(boolean enabled, } 更新Alarm状态。 值得注意的上...

李海珍 ⋅ 2012/09/18 ⋅ 1

android--------listview之适配器

ListView之适配器的使用,包含了ArrayAdapter,SimpleAdapter ,BaseAdapter等适配器。 1:ArrayAdapter 预览效果: 2:SimpleAdapter 使用simpleAdapter的数据用一般都是HashMap构成的List,...

切切歆语 ⋅ 2016/11/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 12分钟前 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 24分钟前 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 27分钟前 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 41分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 57分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 今天 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 今天 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部