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 ...
随机推荐
- S - Primitive Primes CodeForces - 1316C 数学
数学题 在f(x)和g(x)的系数里找到第一个不是p的倍数的数,然后相加就是答案 为什么? 设x1为f(x)中第一个不是p的倍数的系数,x2为g(x)...... x1+x2前的系数为(a[x1+x2 ...
- F - Dragon Balls
Five hundred years later, the number of dragon balls will increase unexpectedly, so it's too difficu ...
- Linux相关操作
ssh配置秘钥 连接远程服务器时:需要用户持有“公钥/私钥对”,远程服务器持有公钥,本地持有私钥. 客户端向服务器发出请求.服务器收到请求之后,先在用户的主目录下找到该用户的公钥,然后对比用户发送过来 ...
- 基于thinkphp3.2.3开发的CMS内容管理系统 - ThinkPHP框架
基于thinkphp3.2.3开发的CMS内容管理系统 thinkphp版本:3.2.3 功能: --分类栏目管理 --文章管理 --用户管理 --友情链接管理 --系统设置 目前占时这些功能,更多功 ...
- 详解 通道 (Channel 接口)
在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...
- 立体匹配-----NCC视差匹配
目录 一.立体匹配算法 1.立体匹配算法分类 二.NCC 视差匹配方法 1.原理 2.NCC计算公式 3.算法流程 4.代码实现 5.不同场景运行 三.结论 四.遇到的问题及解决方法 一.立体 ...
- Deep Snake : 基于轮廓调整的SOTA实例分割方法,速度32.3fps | CVPR 2020
论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不仅提升了性能还减少了计算量,保持了实时性,但是Deep snake的大体结构不够优雅,应该还有一些工作可以 ...
- opencv-2-VS2017与QT显示图像
opencv-2-VS2017与QT显示图像 opencvqtVSC++ 目的 使用 VS 构建第一个 opencv 程序 使用 QT 构建 第一个 opencv 程序 VS 导入 QT 程序 开始 ...
- javescrip内嵌样式与外联样式怎么做?
对于前端初学者,个人JS样式常用的有两种:内嵌样式 ,外联样式:下面通过一个简单的鼠标点击出现设定的验证数字为例进行演示: 先看下效果: 鼠标点击前效果: 鼠标点击后效果: 图中的这个ojbk是我js ...
- 标准库 xml
xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...