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 ... 
随机推荐
- 【题解】P4570 [BJWC2011]元素 - 线性基 - 贪心
			P4570 [BJWC2011]元素 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 给你 \(n\) 个二元组 \( ... 
- 从零开始学AB测试:躲坑篇
			AB测试的原理很简单,只用到了最简单的统计假设检验,但表面的简单通常都隐藏着陷阱,这一点没有经过实践的摸爬滚打是不容易看到的,今天我就把前人已经踩过的坑,一共15个,给大家分享一下.在分享之前,大家脑 ... 
- react: typescript interface useState issue
			define interface: interface ILoginState { imageId: string; imageSrc: string; username: string; passw ... 
- pytorch 去除维度为1的维度
			out.squeeze(dim=1) out.squeeze_(dim=1) 
- audio的自动播放报错解决
			使用audio标签时,当前页面没有进行交互时,比如用户刷新了页面后,play()调用就会报错,如下图 查找资料后,发现是2018年4月以后,chrome浏览器对这块进行了优化,为了节约流量,禁止了自动 ... 
- 云开发网站托管悄悄上线了 Next.js 的支持
			我们知道部署web应用程序的最佳方式是作为静态HTML应用程序,因为他对搜索引擎很友好,速度快等等,这对我们写个人博客这样的小型网站无异于非常nice.如果你的应用可以作为静态HTML,那么可以试试N ... 
- AIX详细的VG,LV扩容步骤
			需求 1.归档日志刷得太快,经常把空间挤爆. 2.Oracle数据库表空间需要扩容 解决方案 1.先做重要数据备份 2.进行文件系统扩容 步骤 1. df -g 查找出/u01 对应的VG卷 VOLU ... 
- Windows 版本 Enterprise、Ultimate、Home、Professional
			关于Windows 的安装光盘版本很多种,很多人不知道选择哪些. Ultimate 旗舰版,VISTA开始有了这个级别,是最全最高级的,一般程序开发的电脑,玩游戏的电脑,建议用它,不过对配置稍有一些要 ... 
- Linux系统管理第一次作业   系统命令
			上机作业: 1.请用命令查出ifconfig命令程序的绝对路径 [root@localhost ~]# which ifconfig /usr/sbin/ifconfig 2.请用命令展示以下命令哪 ... 
- Docker虚拟化管理:30分钟教你学会用Docker
			关于Docker的官方介绍网上太多了我就不贴了,就实际体验来说Docker可以极大的简化环境搭建及服务部署的操作流程,大大降低部署的时间成本,解放你的双手. 本文不会深入讲解Docker底层架构及运行 ... 
