Android优化版ListView(附源代码)

简介: 本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。

本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。


首先有5个代码块,由简单到难,也是按这个顺序来。



(1)XML主代码

(1)只需要一个LIstView来实现,不需要填充内容。因为整个屏幕都是ListView,后面我们再往里面填充即可。

1.<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_base" />
</LinearLayout>


(2)XML布局代码

(2)这是为了实现每个Item的元素是怎么样来布局的,比如把图片放在哪个位置,文字放在图片左边等等。当然只是布局,并不填充内容进去。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/imaged"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"/>
        <TextView
            android:id="@+id/tv_subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="13dp"/>
    </LinearLayout>
</LinearLayout>


(3)Java内容类代码

(3)然后下面就是Java内容类代码,这是为了填充内容和获取内容的类,不需要继承什么,主要是为了以下Java主函数和Java自定义适配器类中的List容器限制泛型,只能传入内容类对象

1.package com.example.adapter_test.base_class;
public class LayoutData {
    private int imageViewID;
    private String textView;
    private String subtextView;
    public LayoutData(int imageViewID, String textView, String subtextView) {
        this.imageViewID = imageViewID;
        this.textView = textView;
        this.subtextView = subtextView;
    }
    public int getImageViewID() {
        return imageViewID;
    }
    public String getTextView() {
        return textView;
    }
    public String getSubtextView() {
        return subtextView;
    }
}



(4)Java自定义Adapter代码

(4)然后就是比较难理解的Java自定义Adapter类的编写,话不多说,注释已经很详细了,这个类主要是把数据和ListView连接起来,在主函数中调用此类,最重要的就是getView()方法,灵活度高。

package com.example.adapter_test.base_class;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import com.example.adapter_test.R;
import java.util.ArrayList;
import java.util.List;
public class MyAdapter extends BaseAdapter {
    //定义数据
    private List<LayoutData> data = new ArrayList<LayoutData>();
    //定义上下文
    private Context context;
    //定义xml布局文件(也可以直接设置,此处是为了通用度高)
    private int mResource;
    //让主函数传参过来(数据,上下文,xml布局文件)
    public MyAdapter(List<LayoutData> data, Context context, @LayoutRes int resource) {
        this.data = data;
        this.context = context;
        this.mResource = resource;
    }
    //下面三个重写函数基本不变
    @Override
    public int getCount() {
        return data.size();
    }
    @Override
    public Object getItem(int position) {
        return data.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //定义一个holder对象
        ViewHolder holder;
        //调用上方的getItem函数,由于向上转换为Object,需要类型转换
        //等于data.get(position),这样的话就不用类型转换了
        //此处作用是获取对应position的List<Layoutdata> data列表数据的图片和文字
        LayoutData dd= (LayoutData) getItem(position);
        //判断是否已经创建过了,如果没创建过
        if(convertView == null)
        {
            //创建一个holder对象用来存储findViewByid的控件
            holder = new ViewHolder();
            //实例化布局
            convertView=LayoutInflater.from(context).inflate(mResource,
                    parent, false);
            //在布局中找控件
            holder.img = (ImageView)convertView.findViewById(R.id.imaged);
            holder.title = (TextView)convertView.findViewById(R.id.tv_title);
            holder.subtitle = (TextView)convertView.findViewById(R.id.tv_subtitle);
            //储存对象
            convertView.setTag(holder);
        }
        //已经创建过了
        else
        {   //就不用再找控件了
            holder = (ViewHolder)convertView.getTag();
        }
        //以下三句必须放在if语句的外面,否则只会显示一条
        //设置图片和文字
        holder.img.setImageResource(dd.getImageViewID());
        holder.title.setText(dd.getTextView());
        holder.subtitle.setText(dd.getSubtextView());
        //返回填充完成的Item
        return convertView;
    }
    //储存控件类,布局里有什么控件就定义什么
    class ViewHolder{
        public ImageView img;
        public TextView title;
        public TextView subtitle;
    }
}


(5)Java主代码

(5)最后就是Java主函数,这个比较简单,找一下XML里面的ListView,然后定义一个List data的容器为了存放数据,然后在OnCreate()中填充一下数据,再为ListView设置一个Adapter就可以显示了。

package com.example.adapter_test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.example.adapter_test.base_class.LayoutData;
import com.example.adapter_test.base_class.MyAdapter;
import java.util.ArrayList;
import java.util.List;
public class BaseAdapter extends AppCompatActivity {
    ListView listView;
    List<LayoutData> data = new ArrayList<LayoutData>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);
        listView = findViewById(R.id.lv_base);
        initdata();
        listView.setAdapter(new MyAdapter(data,this,R.layout.simple_adapter_2));
    }
    private void initdata() {
        LayoutData layoutData1=new LayoutData(R.drawable.local
                ,"无忌哥","999");
        data.add(layoutData1);
        LayoutData layoutData2=new LayoutData(R.drawable.like
                ,"wujige","333");
        data.add(layoutData2);
        LayoutData layoutData3=new LayoutData(R.drawable.share
                ,"oo哥","777");
        data.add(layoutData3);
    }
}
目录
相关文章
|
3月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
66 10
|
4月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
133 2
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
65 20
Android经典面试题之图片Bitmap怎么做优化
|
1月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
46 4
|
15天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
62 2
|
2月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
236 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
191 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
70 0