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的更多相关文章

  1. android ListView 九大重要属性详细分析、

    android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...

  2. 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...

  3. Android ListView 常用技巧

    Android ListView 常用技巧 Android TextView 常用技巧 1.使用ViewHolder提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每 ...

  4. Android实用代码七段(五)

      前言  每次分享意味着每次都有进步,本系列以实用为主,欢迎和我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯 ...

  5. Android开发代码规范(转)

    Android开发代码规范 1.命名基本原则    在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...

  6. Android ListView ListActivity PreferenceActivity背景变黑的问题ZT

    Android ListView ListActivity PreferenceActivity背景变黑的问题 ListView在滚动时背景会变暗甚至变黑,这个要从Listview的效果说起,默认的L ...

  7. 【转】android ListView 几个重要属性

    android ListView 几个重要属性 分类: Android2012-03-08 19:25 19324人阅读 评论(5) 收藏 举报 listviewandroid活动javalistnu ...

  8. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

  9. Android ListView+image的使用

    首先创建layout部局文件xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayo ...

随机推荐

  1. H - Knight Moves DFS

    A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...

  2. 最短路径变形 POJ 2253

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  3. 基于 HTML5 WebGL 的高炉炼铁厂可视化系统

    前言       在当今 工业4.0 新时代的推动下,不仅迎来了 工业互联网 的发展,还开启了 5G 时代的新次元.而伴随着带宽的提升,网络信息飞速发展,能源管控上与实时预警在工业互联网中也占着举足轻 ...

  4. tensorflow1.0 lstm学习曲线

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt BATCH_START = 0 TIME_STEP ...

  5. 数据挖掘入门系列教程(十一点五)之CNN网络介绍

    在前面的两篇博客中,我们介绍了DNN(深度神经网络)并使用keras实现了一个简单的DNN.在这篇博客中将介绍CNN(卷积神经网络),然后在下一篇博客中将使用keras构建一个简单的CNN,对cifa ...

  6. js 之 JSON详解

    JSON:JavaScriptObjectNotation JSON是一种语法,用来序列化对象.数组.字符串.布尔值和null. JSON是基于JavaScript的语法,但与之不同 注意事项 JSO ...

  7. Pytorch中自定义神经网络卷积核权重

    1. 自定义神经网络卷积核权重 神经网络被深度学习者深深喜爱,究其原因之一是神经网络的便利性,使用者只需要根据自己的需求像搭积木一样搭建神经网络框架即可,搭建过程中我们只需要考虑卷积核的尺寸,输入输出 ...

  8. 【集群实战】共享存储实时备份(解决nfs共享存储的单点问题)

    1. nfs存储的单点问题 如果nfs服务器宕机了,则所有的nfs客户机都会受到影响.一旦宕机,会丢失部分用户的数据.为了解决单点问题,需要实现共享存储的实时备份,即:将nfs服务端共享目录下的数据实 ...

  9. 什么是.pyc文件

    1. Python是一门解释型语言? Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在. 如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled ...

  10. ES6的let和const命令(一)

    2019独角兽企业重金招聘Python工程师标准>>> ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变 量,只在let命令所在的代码块内有效. let   ...