Android ListView 代码1
ListView效果
ListView允许用户通过手机上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上的数据则会滚动出屏幕。
一、ListView的简单用法
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
MainActivity
public class MainActivity extends Activity {
private String[] datas={"Apple" ,"Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango","Apple" ,"Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String>adpter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,datas);//当前上下文、ListView子项布局的Id,要适配的数据
//其中android.R.layout.simple_list_item_1是Android内置的布局文件,里面只有一个TextView可用于简单地显示一段文本。
ListView listview=(ListView)findViewById(R.id.list_view);
listview.setAdapter(fruitAdapter);
}
}
ListView用来展示大量数据,我们先将数据准备好,比如这里的datas数组。不过数据无法直接传递给ListView,需要借助适配器来完成。ArrayAdapter就是Android提供的一个适配器的实现类,它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。
二、定制ListView的界面
目标
实现水果名称旁边都有一个图样
步骤
1.定义一个实体类作为ListView适配器的适配对象。
Ftuit类
public class Fruit {
private String name;
private int imageId;
public Fruit(String name,int imageId){
this.name=name;
this.imageId=imageId;
}
public int getImageId() {
return imageId;
}
public String getName() {
return name;
}
}
2.为ListView的子项指定我们的自定义布局
fruit_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
</LinearLayout>
3.创建自定义适配器,这个适配器继承自ArrayAdapter,并将泛型指定为Fruit类
FruitAdapter类
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
//重写父类构造方法,用于将上下文、ListView子项布局的id和数据传递进来
public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects){
super(context,textViewResourceId,objects);
resourceId=textViewResourceId;
}
//这个方法在每个子项被滚动到屏幕内时会被调用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit=getItem(position);//获取当前项的fruit实例
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);//使用LayoutInflater来为这个子项加载我们传入的布局
ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
TextView fruitname=(TextView)view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitname.setText(fruit.getName());
return view;
}
}
LayoutInflater的inflate()方法接收三个参数,第三个指定成false表示我们在父布局中声明的layout属性生效,但不会为这个View添加父布局,因为View一旦有了父布局之后,它就不能再添加到ListView中了。
4.调用View的findViewById()获取ImageView和TextView的实例,设置图片和文字
MainActivity
public class MainActivity extends Activity {
private List<Fruit>fruitList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();//初始化水果数据
FruitAdapter fruitAdapter=new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
ListView listview=(ListView)findViewById(R.id.list_view);
listview.setAdapter(fruitAdapter);
}
private void initFruits(){
for(int i=0;i<2;i++){
Fruit apple=new Fruit("Apple",R.drawable.apple);
fruitList.add(apple);
Fruit Banana=new Fruit("Banana",R.drawable.banana);
fruitList.add(Banana);
Fruit Orange=new Fruit("Orange",R.drawable.orange);
fruitList.add(Orange);
Fruit Watermelon=new Fruit("Watermelon",R.drawable.watermelon);
fruitList.add(Watermelon);
Fruit Pear=new Fruit("Pear",R.drawable.pear);
fruitList.add(Pear);
Fruit Grape=new Fruit("Grape",R.drawable.grape);
fruitList.add(Grape);
Fruit Pineapple=new Fruit("Pineapple",R.drawable.pineapple);
fruitList.add(Pineapple);
Fruit Strawberry=new Fruit("Strawberry",R.drawable.strawberry);
fruitList.add(Strawberry);
Fruit Cherry=new Fruit("Cherry",R.drawable.cherry);
fruitList.add(Cherry);
Fruit Mango=new Fruit("Mango",R.drawable.mango);
fruitList.add(Mango);
}
}
}
运行时,先创建FruitAdapter适配器,将上下文和子项ID(R.layout.fruit_item)和数据传入,当每个子项被滑动到屏幕内时,调用getView()方法,通过LayoutInflater获得View,再通过view的findViewById()将水果的图片和名称传入。
接下来获得activity_main.xml中的ListView,将创建好的适配器传入。
三、ListView的性能提升
ListView效率很低,在FruitAdapter的getView()方法中,每次都将布局重新加载一遍,当ListView快速滚动时,这就会成为性能的瓶颈
仔细观察会发现,getView()中有一个convertView参数,这个参数用于缓存之前加载好的布局,以便之后的重用。
修改FruitAdapter中的代码1:使用convertView加载缓存布局
public class FruitAdapter extends ArrayAdapter<Fruit> {
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit=getItem(position);//获取当前项的fruit实例
View view;
if(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}else{
view=convertView;
}
ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
TextView fruitname=(TextView)view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitname.setText(fruit.getName());
return view;
}
}
修改FruitAdapter中的代码2:使用ViewHolder类保存控件(通过view的setTag()方法,将ViewHolder对象存储在View中)
public class FruitAdapter extends ArrayAdapter<Fruit> {
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit=getItem(position);//获取当前项的fruit实例
//View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
View view;
ViewHolder viewHolder;
if(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
viewHolder=new ViewHolder();
viewHolder.fruitImage=view.findViewById(R.id.fruit_image);
viewHolder.fruitname=view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);//将viewHolder存储在View中
}else{
view=convertView;
viewHolder=(ViewHolder)view.getTag();//重新获取ViewHolder
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitname.setText(fruit.getName());
return view;
}
class ViewHolder{
ImageView fruitImage;
TextView fruitname;
}
}
四、ListView的点击事件
修改MainActivity中的代码
public class MainActivity extends Activity {
private List<Fruit>fruitList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getActionBar();
if(actionBar!=null){
actionBar.hide();
}
initFruits();//初始化水果数据
FruitAdapter fruitAdapter=new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
ListView listview=(ListView)findViewById(R.id.list_view);
listview.setAdapter(fruitAdapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int positon, long id) {
Fruit fruit=fruitList.get(positon);
Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void initFruits(){
for(int i=0;i<2;i++){
Fruit apple=new Fruit("Apple",R.drawable.apple);
fruitList.add(apple);
Fruit Banana=new Fruit("Banana",R.drawable.banana);
fruitList.add(Banana);
Fruit Orange=new Fruit("Orange",R.drawable.orange);
fruitList.add(Orange);
Fruit Watermelon=new Fruit("Watermelon",R.drawable.watermelon);
fruitList.add(Watermelon);
Fruit Pear=new Fruit("Pear",R.drawable.pear);
fruitList.add(Pear);
Fruit Grape=new Fruit("Grape",R.drawable.grape);
fruitList.add(Grape);
Fruit Pineapple=new Fruit("Pineapple",R.drawable.pineapple);
fruitList.add(Pineapple);
Fruit Strawberry=new Fruit("Strawberry",R.drawable.strawberry);
fruitList.add(Strawberry);
Fruit Cherry=new Fruit("Cherry",R.drawable.cherry);
fruitList.add(Cherry);
Fruit Mango=new Fruit("Mango",R.drawable.mango);
fruitList.add(Mango);
}
}
}
我们使用setOnItemClickListenser()方法为ListView注册监听器,当点击ListView任何一个子项时,就会回调onItemClick()方法。position参数可以判断用户点击的是哪一个子项,对应着数组的下标,然后就能获取到相应的数据。
Android ListView 代码1的更多相关文章
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...
- Android ListView 常用技巧
Android ListView 常用技巧 Android TextView 常用技巧 1.使用ViewHolder提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每 ...
- Android实用代码七段(五)
前言 每次分享意味着每次都有进步,本系列以实用为主,欢迎和我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯 ...
- Android开发代码规范(转)
Android开发代码规范 1.命名基本原则 在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...
- Android ListView ListActivity PreferenceActivity背景变黑的问题ZT
Android ListView ListActivity PreferenceActivity背景变黑的问题 ListView在滚动时背景会变暗甚至变黑,这个要从Listview的效果说起,默认的L ...
- 【转】android ListView 几个重要属性
android ListView 几个重要属性 分类: Android2012-03-08 19:25 19324人阅读 评论(5) 收藏 举报 listviewandroid活动javalistnu ...
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
- Android ListView+image的使用
首先创建layout部局文件xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayo ...
随机推荐
- Closest Common Ancestors POJ 1470
Language: Default Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissio ...
- mapstruct使用详解
我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 mod ...
- 你自学半年也搞不懂的go底层,看这篇。这篇讲 go的数组、切片、Maps
目录 数组 1.定义数组 2.使用数组 3.定义并赋值 4.数组的大小是类型的一部分 5.数组是值类型(当参数传递到函数中,修改不会改变原来的值) 6.数组长度 7.循环数组 8.多维数组 切片 1. ...
- 关于MIME类型问题,浏览器请求到的资源是乱码
简介 我想很多同学都可能会遇到这样的问题,调用后台提共的静态资源服务api时,用浏览器打开发现却是一堆乱码.需要的是 JSON, 拿到的却是 xml,访问一个mp4的文件,浏览器直接下载.这一切的来源 ...
- 原子类的ABA问题
原子类AtomicInteger的ABA问题 连环套路 从AtomicInteger引出下面的问题 CAS -> Unsafe -> CAS底层思想 -> ABA -> 原子引 ...
- Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁
JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计 ...
- java并发中CountDownLatch的使用
文章目录 主线程等待子线程全都结束之后再开始运行 等待所有线程都准备好再一起执行 停止CountdownLatch的await java并发中CountDownLatch的使用 在java并发中,控制 ...
- 【Linux题目】第九关
前言:项目整合 企业项目实战考试: 1. 全网备份解决方案实战 2. NFS集群后段共享存储搭建优化 3. 解决NFS单点实现实时数据同步. 环境: 服务器角色 外网ip 内网ip 主机名 web 1 ...
- shell脚本(多线程批量创建用户)
shell脚本中的多线程 很多场景中会用到多线程,例如备份数据库,有100个库,正常备份效率极其低下.有了多线程原本可能需要10个小时备份,现在分10个线程同时去干,只要一个小时就解决了.今天就介绍下 ...
- 深入理解Mysql——锁、事务与并发控制
本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...