Android ListView优化

Android ListView高效实现与优化教程 本文还有配套的精品资源,点击获取 简介:ListView是Android中用于展示列表数据的关键组件, MyListView 项目提供了实际的代码示例,帮助开发者掌握如何高效使用ListView。课程内容涵盖了ListView的基础结构、Adapter模式、ViewHolder优化、监听器设置、性能优化、下拉刷新与上拉加载、自定义ListView、动画效果、数... 阅读详情

Android ListView优化

Android ListView优化,我们将从内存缓存的角度来完成ListView的优化

一.定义显示ListView的布局文件:listView_text.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.cxy.listview.MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true"/>
</RelativeLayout>


二.定义item显示的样式分别定义Name,ClassRom,Age的样式:list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Name"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal"/>
    <TextView
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ClassRom"
        android:id="@+id/textView2"
        android:layout_gravity="right"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>
    <TextView
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Age"
        android:id="@+id/textView3"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>
</RelativeLayout>



三.新建一个entity包,在包中新建一个Student封装类,将信息Name,ClassRom,Age封装在此类中,并且生成set/get方法,便于 ListView使用。

package com.example.cxy.listview.entity;

/**
 * Created by admin on 2017/2/13.
 */
public class Student {
    private String name;
    private String classRom;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getClassRom() {
        return classRom;
    }

    public void setClassRom(String classRom) {
        this.classRom = classRom;
    }
}

Set / Get方法生成



四.再新建一个adapter包,在包中新建一个Myadapter类,这就是最重要的ListViewAdapter适配器。

1.编写一个私有的List<Student>集合和一个私有的上下文对象(Context)

2.构造一个List集合和Context上下文对象的有参构造方法



3.然后将Myadapter继承自BaseAdapter类



4.自定义一个内部类ViewHolder



5.创建一个ViewHodler类对象

6.使用if/else判断当前converView是否为空,如果为空则加载新的item行布局,并且实例化ViewHodler

7.通过视图寻找控件ID,

8.设置converView缓存标签,传入控件

9.在else中从converView视图中获取缓存的标签

10.将对应的下标赋值给对应位置

11.返回当前converView视图给用户看

package com.example.cxy.listview.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.cxy.listview.R;
import com.example.cxy.listview.entity.Student;

import java.util.List;

/**
 * Created by admin on 2017/2/13.
 */
public class Myadapter extends BaseAdapter{
    private List<Student> mList;
    private Context mContext;
    //有参构造方法
    public Myadapter(List<Student> list, Context context) {
        mList = list;
        mContext = context;
    }

    //获取列表总长度
    @Override
    public int getCount() {
        //返回一个全局的列表的总长度
        return mList.size();
    }

    //获取当前整个item(一整行)返回一个当前视图中的所有数据
    @Override
    public Object getItem(int position) {
        //返回下标
        return mList.get(position);
    }

    //获取当前item的ID
    @Override
    public long getItemId(int position) {
        //返回下标
        return position;
    }

    //获取视图              当前视图下标     指当前视图           上级父容器
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //创建一个ViewHodler类对象
        ViewHodler viewHodler;
        //判断当前converView是否为空,如果为空
        if (convertView==null){
            //则加载新的item行布局
            convertView= LayoutInflater.from(mContext).inflate(R.layout.item_list,null);
            //实例化viewHodler
            viewHodler=new ViewHodler();
            //通过视图寻找控件ID
            viewHodler.mTextView1= (TextView) convertView.findViewById(R.id.textView);
            viewHodler.mTextView2= (TextView) convertView.findViewById(R.id.textView2);
            viewHodler.mTextView3= (TextView) convertView.findViewById(R.id.textView3);
            //设置convertView缓存标签,传入控件
            convertView.setTag(viewHodler);
        }else{
            //从convertView视图中获取缓存的标签
            viewHodler= (ViewHodler) convertView.getTag();
        }
        //将对应下标的值赋给对应位置
        viewHodler.mTextView1.setText(mList.get(position).getName());
        viewHodler.mTextView2.setText(mList.get(position).getClassRom());
        viewHodler.mTextView3.setText(String.valueOf(mList.get(position).getAge()));
        //返回当前converView视图给用户看
        return convertView;
    }
    //自定义内部类ViewHolder
    class ViewHodler{
        TextView mTextView1,mTextView2,mTextView3;
    }
}

五.最后编写测试类:MainActivity

1.编写一个私有的ListView列表和私有的List数组

2.新建一个初始化方法inintent

3.给ListView配置ID地址

4.实例化List数组

5.使用一个For循环

6.在For循环中实例化Student

7.给Student封装类中的Name,ClassRom,Age赋值

8.将赋的值放在List数组中

9.在For循环外初始化adapter适配器

10.将适配器的数去放到ListView列表中

package com.example.cxy.listview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import com.example.cxy.listview.adapter.Myadapter;
import com.example.cxy.listview.entity.Student;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ListView mListView;
    private List<Student> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //新建一个初始化方法
        inintent();
    }

    private void inintent() {
        //给ListView配置ID地址
        mListView= (ListView) findViewById(R.id.listView);
        //实例化List数组
        mList=new ArrayList<>();
        for(int i=0; i<100; i++){
            //实例化Student
            Student s=new Student();
            //给Student封装类中的Name,ClassRom,Age赋值
            s.setName("cxy"+i);
            s.setClassRom("ListView"+i);
            s.setAge(18+i);
            //将赋的值放在List数组中
            mList.add(s);
        }
        //初始化adapter适配器
        Myadapter myadapter=new Myadapter(mList,this);
        //将适配器的数去放到ListView列表中
        mListView.setAdapter(myadapter);
    }
}

六.运行程序


android_ListView优化 android_ListView优化Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源 ... 立即下载

相关推荐

Android ListView常见的优化方式详解

ListView的优化 对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式. 1.条目复用优化 其实listview的工作原理就是,listview在请求屏幕可见的item数时,convertView在getVIew中是null 的. 但是当屏幕向下滑动的时候(比如该屏幕尺寸可显示7条teim),在item1被隐藏,此时出现item8时,covertView的值就不为null 了,因为item1去填充它. 而如果不做复用处理的话,item8 则会继续去findviewById, 因此其实每个item里的View控件,

Android之——ListView优化

作为客户端,其最主要的任务就是最直观的和用户交互。从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果。这是我自己的理解,所以我们的程序,必须给用户一个良好的体验。 listView可以说是安卓开发中很重要的一个控件。我所做的项目中,几乎每个页面都会有listView。Adapter是listView和数据源间的中间人。当每条数据进入可见区域时,adapter

冰河的专栏 4149

西电计科数据库系统期末复习笔记

本人西电19计科,数据库系统98,这是复习期间整理的笔记,基本涵盖了课程全部重点,有需要的学弟学妹可以在复习的时候参考一下。

Polaris的博客 8596

【提升栈】ListView优化

ListView优化

Android23333的博客 717

支持找回微信删除好友!一款人人可用的全能微信数据分析工具

找回删除好友、查看删除记录、恢复聊天信息....

1725

Flutter 完整学习文档 - 从入门到精通

Widget 就像乐高积木,Flutter 中所有的东西都是 Widget。一个按钮是 Widget,一段文字是 Widget,甚至布局、边距、对齐方式也是 Widget!"万物皆 Widget"

zwjapple的专栏 2316

Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的。这里我们没有加载完iamge之后直接设定到相应的ImageView上 ,而是通过Tag查找,这里我们重用的View 这里有个listView的引用来通过Tag查找 可见 CallBack的实现。注意这里使用了 SoftReference来缓存图片,允许 GC在需要的时候可以对缓存中的图片进行清理。

lmrylll的博客 865

【异常】SpringCloud Gateway报错503 SERVICE_UNAVAILABLE “Unable to find instance for xxx-gen“

网关服务报错,如下。

奶爸的编程之路,也就一周冷个三天 4223

android listview优化,Android ListView 详解及其优化

一、基本原理ListView 是一个显示一列可滚动项目的视图组。 系统使用 Adapter 自动将列表项目插入列表,适配器从来源(例如数组或数据库查询)提取内容,并将每个项目结果转换为视图放置到列表中。列表数据的显示需要 4 个元素:ListView 视图组;用来把数据映射到 ListView 上的 Adapter;需要展示的数据集;数据展示的 View 模版。ListView 只负责加载和管理视...

weixin_29985807的博客 432

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

Android-ListView适配器BaseAdapter的使用和优化

Android-ListView适配器BaseAdapter的使用 这是BaseAdapter的相应的方法属性。 像SimpleAdapter和ArrayAdapter都是继承于BaseAdapter。 可以查看其源码: SimoleAdapter ArrayAdapter 写几个小demo熟悉一下。activity_main.xml 设置组件ListView<Relative

Kid_TH的博客 1万+

高通拨号流程介绍

本文介绍了高通平台(如SDX55)中APSS(A7处理器)与ModEM(Q6处理器)间的通信机制。

四儿家的小祖宗的博客 1067

安卓之高级控件Listview的优化

效果图如下: XML代码(activity_main)如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:la

YDCookie的博客 494

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android之ListView原理学习与优化总结

2.3:在ListView中取图片时也不要直接拿个路径去取图片,而是以WeakReference(使用WeakReference代替强引用。比如可以使 用WeakReference mContextRef)、SoftReference、WeakHashMap等的来存储图片信息,是图片信息不是图片哦!2.4:在getView中做图片转换时,产生的中间变量一定及时释放,用以下形式:**bmp.recycle() //回收图片所占的内存。6.1:将线程的内部类,改为静态内部类。

2401_89690178的博客 1061

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android的listview优化方案,Android ListView介绍及优化方案

xml设计-主javapackage com.itheima.listview;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.TextureVie...

weixin_36227730的博客 203

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android ListView使用BaseAdapter与ListView的优化

BaseAdapter ListView

sbisyju的专栏 5205

安卓ListView性能优化(二)

         安卓ListView总结(一)      安卓ListView性能优化(二)     安卓ListView下拉刷新和加载(三)     ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能。 1.在adapter中的getView方法中尽量少使用逻辑 2...

不忘初心 915

【Android】ListView性能优化

使用convertView缓存布局 convertView 用于将之前的布局进行缓存,通过重用来提高性能 public class MyAdapter extends ArrayAdapter<Fruit> { …… @Override public View getView(int position, View convertView, View parent) { Fruit fruit = getItem(position); View view; if(convertV

qq_40313347的博客 336

【Android】ListView 优化

重用 ListView ItemListView创建时其会创建屏幕可容纳数量的 Item,ListView 滚动时,刚消失的 item 会被保存到回收池中,新出现的 item 从回收池中获取避免重复创建,这个回收池由 ListView 维护。从回收池取出 item 会传递给 Adapter 的 getView() 方法的第二个参数,如果回收池中没有内容就传递一个 null。所以在 getView()

业精于勤荒于嬉,行成于思毁于随 1274

Android中ListView的优化

安卓中ListView使用的频率还是很高的,为了避免内存泄漏,优化就显得是必须的了 直接上代码(这里只写了一级、二级优化)public class MyAdapter extends BaseAdapter { private Context context;//上下文 private ArrayList<CaiBean> cbs;//数据源 public MyAdapter

Mr_GLY_di的博客 556

Android中Listview的优化

说起Listview的优化,老生常谈啊,面试必问的一个点。我在筛选面试简历的时候,发现一个童鞋简历上写着ListView优化使用三级缓存?什么鬼?我孤陋寡闻了,哈哈,之前还真不知道,网上看了下零零散散,这方面的讲解并不是很详细,搜罗了几篇文章,我在这里做一下整合,回头好好研究一下,大家共同学习。 首先Listview是需要和适配器配合使用的,常用的适配器有ArrayAdapter,SimplerAd

GeofferySun的专栏 862

【安卓】ListView的优化

①继上一次FruitAdapter的getView()方法每次的调用都要对布局进行一次重新加载 这次使用getView中的converView参数,用于将之前加载好的布局进行缓存,以便重复使用 先判断布局是否存在 若不存在,则加载布局,若存在,则用convertView进行重用 if(convertView == null){ view = LayoutInfl...

longlongfishday的博客 290

安卓中listview中性能优化的处理

我们不要在ListView滑动的时候载入图片,那样会使ListView变得卡顿,所以我们须要再监听器里面监听ListView的状态。能够让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们能够手动将它关闭掉。// 这是设置image的參数,每次getView方法运行时都会运行这段代码。//在这里进行逻辑推断。说白了就是减少更多的嵌套布局。

m0_62089210的博客 666
上一篇: Android ListView优化技巧
下一篇: Android Gallery画廊
Android开发-CXY
博客等级 码龄10年 33粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值