你所了解的BaseAdapter是这样的吗?

本文介绍了一种在Android应用中优化ListView性能的方法,通过使用ViewHolder模式结合ListView的缓存机制来减少视图重建次数,从而提升用户体验。

1.首先给出activity_main.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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lzw.teacherstudent.MainActivity">

    <ListView
        android:id="@+id/lv_article"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</RelativeLayout>
2.其次是item.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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lzw.teacherstudent.MainActivity">

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/iv_image"
        android:layout_toRightOf="@id/iv_image"
        android:text="文章标题"
        android:textSize="25sp"
        android:gravity="center"
        />
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/iv_image"
        android:layout_toRightOf="@id/iv_image"
        android:layout_alignBottom="@id/iv_image"
        android:text="文章标题"
        android:textSize="18sp"
        android:gravity="center_vertical"
        />
</RelativeLayout>
3.给出ItemBean代码:

package com.lzw.teacherstudent;

/**
 * Created by 李志伟 on 2016/7/27.
 */
public class ItemBean {
    public int ItemImageId;
    public String ItemTitle;
    public String ItemContent;

    public ItemBean(int itemImageId, String itemContent, String itemTitle) {
        ItemImageId = itemImageId;
        ItemContent = itemContent;
        ItemTitle = itemTitle;
    }
}
4.MainActivity代码:

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

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

public class MainActivity extends Activity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //配置数据源
        List<ItemBean> beanList = new ArrayList<>();
        for(int i=0; i<20; i++){
            beanList.add(new ItemBean(
                    R.mipmap.ic_launcher,
                    "我是标题" + i,
                    "文章内容" + i
            ));
        }
        ListView listView = (ListView) findViewById(R.id.lv_article);
        //上下文,数据源
        listView.setAdapter(new MyAdapter(this,beanList));
    }
}
5.最关键的MyAdapter:

package com.lzw.teacherstudent;

import android.content.Context;
import android.util.Log;
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 java.util.List;

/**
 * Created by 李志伟 on 2016/7/27.
 */
public class MyAdapter extends BaseAdapter{

    List<ItemBean> mList;
    //查找布局文件
    private LayoutInflater mInflater;

    //通过构造器将数据源与数据适配器MyAdapter关联
    //通过Context将布局文件加载进来,并且实例化
    public MyAdapter(Context context,List<ItemBean> list) {
        mList = list;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        //第一种加载方式--自己创建的一个view
        //每次都进行加载
        /*Long startTime = System.nanoTime();
        View mView = mInflater.inflate(R.layout.item,null);
        ImageView imageView = (ImageView) mView.findViewById(R.id.iv_image);
        TextView tv_title = (TextView) mView.findViewById(R.id.tv_title);
        TextView tv_content = (TextView) mView.findViewById(R.id.tv_content);
        ItemBean bean = mList.get(position);
        imageView.setImageResource(bean.ItemImageId);
        tv_title.setText(bean.ItemTitle);
        tv_content.setText(bean.ItemContent);
        Long endTime = System.nanoTime();
        Long eTime = endTime - startTime;
        Log.i("allTime", String.valueOf(eTime));
        return mView;*/

        //第二种加载方式--使用参数中的view,用到了ListView的缓存机制,但是存在findViewById这一耗时操作
        /*Long startTime = System.nanoTime();
        //如果为空时进行加载
        if(view == null){
            view= mInflater.inflate(R.layout.item,null);
        }
        ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
        TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
        TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
        ItemBean bean = mList.get(position);
        imageView.setImageResource(bean.ItemImageId);
        tv_title.setText(bean.ItemTitle);
        tv_content.setText(bean.ItemContent);
        Long endTime = System.nanoTime();
        Long eTime = endTime - startTime;
        Log.i("allTime", String.valueOf(eTime));
        return view;*/

        //第三种方式,使用缓存机制,以及使用ViewHolder进行保存控件,而不用每次去findViewById
        Long startTime = System.nanoTime();
        ViewHolder viewHolder;
        //如果为空时进行加载
        if(view == null){
            viewHolder = new ViewHolder();
            view= mInflater.inflate(R.layout.item,null);
            viewHolder.imageView = (ImageView) view.findViewById(R.id.iv_image);
            viewHolder.title = (TextView) view.findViewById(R.id.tv_title);
            viewHolder.content = (TextView) view.findViewById(R.id.tv_content);
            //将view和viewHolder进行绑定
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();  //取出关联的viewHolder对象
        }
        ItemBean bean = mList.get(position);
        viewHolder.imageView.setImageResource(bean.ItemImageId);
        viewHolder.title.setText(bean.ItemTitle);
        viewHolder.content.setText(bean.ItemContent);
        Long endTime = System.nanoTime();
        Long eTime = endTime - startTime;
        Log.i("allTime", String.valueOf(eTime));
        return view;
    }

    class ViewHolder{
        private ImageView imageView;
        private TextView title;
        private TextView content;
    }
}
6.总结:

(1)使用自己定义的view来进行加载也能够实现功能,但是耗时较长,且没有用到ListView的缓存机制。

(2)使用参数中定义好的view(即使用缓存机制),在判断为空时进行加载,而不是一次性全部加载完毕。

(3)推荐使用"缓存机制+ViewHolder"来进行BaseAdapter功能的实现。

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值