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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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功能的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值