文档章节

ListView学习(2)-BaseAdapter 的学习

c
 chuiyuan
发布于 2014/05/09 21:36
字数 1357
阅读 110
收藏 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
博文 92
码字总数 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
0
Android软件开发之ListView 详解 (十一)

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

彭博
2012/03/09
292
0
Android软件开发之ListView 详解 (十一)

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

晨曦之光
2012/03/07
209
0
listview与adapter用法

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

ARESXIONG
2015/11/03
0
0
Android listview与adapter用法

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

OScoder2
2014/03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

最全最强解析:支付宝钱包系统架构内部剖析(架构图)

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

晨猫
39分钟前
5
0
竞品分析

那什么样的场景需要用关键纬度分析法分析竞品呢? 竞品分析的目的是为了看竞品们和自己产品重合的业务都具备哪些功能点,以及这些功能是怎么做的,以此确定自己产品的优化方向。 竞品们的业务...

于谦老师
46分钟前
1
0
OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
1K
17
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
9
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部