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);
    }
}
目录
相关文章
|
29天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
1月前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
36 4
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
2月前
|
搜索推荐 安全 Android开发
如何优化安卓应用的用户体验
【2月更文挑战第9天】在当今移动互联网时代,安卓应用已成为人们日常生活中不可或缺的一部分。然而,用户对应用的使用体验越来越苛刻,一个不好的应用体验很容易导致用户的流失。本文将介绍如何从多个方面优化安卓应用的用户体验。
|
26天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
1天前
|
缓存 监控 Android开发
Android 应用性能优化实战
【4月更文挑战第27天】 在竞争激烈的移动应用市场中,性能优越的应用更能吸引和保留用户。针对Android平台,本文将深入探讨影响应用性能的关键因素,并提供一系列实用的优化策略。我们将从内存管理、UI渲染、多线程处理以及电池使用效率等方面入手,通过具体案例分析如何诊断常见问题,并给出相应的解决方案。文中所提技巧旨在帮助开发者构建更加流畅、高效的Android应用。
8 2
|
4天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
5天前
|
Android开发
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
11 0
|
5天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
3 0