Android 自定义ListView
数据,通过contextView.setTag绑定数据有按钮的ListView。
系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义的适配器。实现
自定义适配器,必须手动映射数据,这时就需要重写getView()方法,系统在绘制列表的每一行的时候
将调用此方法。
ListView在开始绘制的时候,系统自动调用getCount()函数,根据函数返回值得到ListView的长度,
然后根据这个长度,调用getView()逐一画出每一行。
具体使用方法可以参考下面代码,只需记住Android自定义ListView三步骤:
第一步:准备主布局文件、组件布局文件等
第二步:获取并整理数据
第三部:绑定数据,这里我们是通过自己编写Adapter类来完成的
1.首先新建一个list.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" >
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" android:background="#f1e4f1">
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#666872"/>
- <Button
- android:id="@+id/view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="详细"/>
- </LinearLayout>
- <TextView
- android:id="@+id/info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#666872"/>
- </LinearLayout>
2、新建一个适配器类MyAdspter.java
- public class MyAdspter extends BaseAdapter {
- private List<Map<String, Object>> data;
- private LayoutInflater layoutInflater;
- private Context context;
- public MyAdspter(Context context,List<Map<String, Object>> data){
- this.context=context;
- this.data=data;
- this.layoutInflater=LayoutInflater.from(context);
- }
- /**
- * 组件集合,对应list.xml中的控件
- * @author Administrator
- */
- public final class Zujian{
- public ImageView image;
- public TextView title;
- public Button view;
- public TextView info;
- }
- @Override
- public int getCount() {
- return data.size();
- }
- /**
- * 获得某一位置的数据
- */
- @Override
- public Object getItem(int position) {
- return data.get(position);
- }
- /**
- * 获得唯一标识
- */
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Zujian zujian=null;
- if(convertView==null){
- zujian=new Zujian();
- //获得组件,实例化组件
- convertView=layoutInflater.inflate(R.layout.list, null);
- zujian.image=(ImageView)convertView.findViewById(R.id.image);
- zujian.title=(TextView)convertView.findViewById(R.id.title);
- zujian.view=(Button)convertView.findViewById(R.id.view);
- zujian.info=(TextView)convertView.findViewById(R.id.info);
- convertView.setTag(zujian);
- }else{
- zujian=(Zujian)convertView.getTag();
- }
- //绑定数据
- zujian.image.setBackgroundResource((Integer)data.get(position).get("image"));
- zujian.title.setText((String)data.get(position).get("title"));
- zujian.info.setText((String)data.get(position).get("info"));
- return convertView;
- }
- }
关于上面LayoutInflater的使用:在实际开发种LayoutInflater这个类还是非常有用的。它的作用类似
于 findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件,并且会实例化!。
getView()的三个参数:position表示将显示的是第几行,covertView是从布局文件中inflate来的布
局。我们用LayoutInflater的方法将定义好的list.xml文件提取成View实例用来显示。然后将xml文件
中的各个组件实例化,这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为
它添加点击监听器,这样就能捕获点击事件。
3、activity_main.xml中添加ListView控件
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".MainActivity" >
- <ListView
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"></ListView>
- </RelativeLayout>
4、在activity中调用ListView
- public class MainActivity extends Activity {
- private ListView listView=null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView=(ListView)findViewById(R.id.list);
- List<Map<String, Object>> list=getData();
- listView.setAdapter(new MyAdspter(this, list));
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- public List<Map<String, Object>> getData(){
- List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
- for (int i = 0; i < 10; i++) {
- Map<String, Object> map=new HashMap<String, Object>();
- map.put("image", R.drawable.ic_launcher);
- map.put("title", "这是一个标题"+i);
- map.put("info", "这是一个详细信息"+i);
- list.add(map);
- }
- return list;
- }
- }

- Android_listView03.rar (985.8 KB)
- 下载次数: 359
Android 自定义ListView的更多相关文章
- Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表
本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...
- [置顶] android 自定义ListView实现动画特效
通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...
- android自定义listview实现圆角
在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...
- Android 自定义ListView单击事件失效
因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目. 出现点击ListView的每一项都不会执行setO ...
- Android 自定义 ListView 显示网络上 JSON 格式歌曲列表
本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...
- Android 自定义 ListView 上下拉动刷新最新和加载更多
本文内容 开发环境 演示上下拉动刷新最新和加载更多 ListView 参考资料 本文演示上下拉动,刷新最新和加载更多,这个效果很常见,比如,新闻资讯类 APP,当向下拉动时,加载最新的资讯:向上拉动时 ...
- Android 自定义ListView实现底部分页刷新与顶部下拉刷新,androidlistview
在项目开发中,由于数据过大时,需要进行分页加载或下拉刷新,来缓解一次性加载的过长等待.本篇博文实例讲解通过自定义的ListView实现底部分页加载和顶部下拉刷新的效果. 其效果图: 一.ListVie ...
- Android 自定义ListView动态加载数据
我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...
- android——自定义listView
都知道微信主机面 有个界面会一行一一行的聊天记录,那个效果就可以用listview来实现(当然这只是其中的一种) listView是一种比较常见的组件它用来展示列的view,它是根据数据的长度来显示数 ...
随机推荐
- 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...
- mysql数据去除重复及相关优化(转)
由于mysql不支持同时对一张表进行操作,即子查询和要进行的操作不能是同一张表,因此需要通过临时表中专以下. 1.单字段重复 生成临时表,其中uid是需要去重的字段 create table tmp_ ...
- i2c协议
i2c协议 http://blog.csdn.net/g_salamander/article/details/8016698 总线设备驱动模型 http://blog.csdn.net/u01395 ...
- ES6 ( 三 ) 字符串扩展
一.字符Unicode表示方法 ES6中可以使用以下6种方法表示字符 '\z' === 'z' // true '\172' === 'z' // true '\x7A' === 'z' // tru ...
- 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
今天我做了一个带有滚动条,底部有两个按钮的div. 当我拖动滚动条到底部, 按钮没有显示出来. 我看了看我的样式设置,是这样的: /* 内容样式 */ #contentPartDiv{ posit ...
- Windows 7 常用快捷键
常用的快捷键 Win键+D 回到桌面/当前界面(切换)Win键+M 回到桌面Win键+E 资源管理器Win键+R 运行 Win键+U 控制面板->所有控制面板项->轻松访问中心 Win键+ ...
- Vim,极简使用教程,让你瞬间脱离键鼠切换的痛苦
注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从而让编辑文本的操作更迅捷.并不等同于IDE,在我看来,它们是两个是包含关系,IDE可以有Vim编辑模式.Vim或许可以通过 ...
- reset 单个文件 回退
git将单个文件恢复到历史版本的正确方法如下: git reset commit_id 文件路径 git checkout -- 文件路径
- 【转】一个新的UIButtonMessage 给NGUI,使用委托,自动选择Receiver提供的方法
http://blog.csdn.net/chiuan/article/details/9290651?utm_source=tuicool&utm_medium=referral 来分享一个 ...
- Source Insight下提示未完整安装的问题
网上的破解版的注册表文件都是针对32位系统的,所以在64位系统里运行根本无法破解.下面分别贴出这俩系统里的破解文件. 使用方法: 分别复制对应系统的内容,新建文本文档,将内容粘贴进去,重命名为.reg ...