IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓中的ListView做到每一个item都不同---以实现圆角背景效果为例 -> 正文阅读

[移动开发]安卓中的ListView做到每一个item都不同---以实现圆角背景效果为例

前言

很多书籍都会讲到ListView的缓存优化,这个想必大家都知道。也正是因为缓存,让ListView变得有时候让人摸不着头脑。比如说我想做一个有圆角背景效果的ListView,如下图:
在这里插入图片描述
也许很多人都会想到在getView方法里,根据position去采用不同的圆角背景图片,如果仅仅是这样,你会发现结果出乎你的意料:为什么有些地方不该圆的它圆了,该圆的它不圆?其实这就是缓存机制导致的。当然了,你也可以选择不采用缓存,但是这会导致性能大大降低,当数据量比较大时,快速滑动列表就会出现比较明显的卡顿现象。本篇博客讲的方法是,既要保证性能,又能保证四个角落为圆角,其他地方不为圆角。

实现方法

在适配器里面,重写BaseAdapter中的getItemViewType(int position )和 getViewTypeCount( ) 这两个方法。告诉安卓系统框架当前的item是什么类型、总共有多少种类型的item。然后,在大家都很熟悉的getView方法里面,根据当前的viewType去加载不同的界面布局就可以了。

关键代码

@Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        int itemViewType = getItemViewType(i);
        if (view==null){
            if (itemViewType==BaseItem.TEXT){
                view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.text_item,viewGroup,false);
                TextViewHolder textViewHolder = new TextViewHolder();
                textViewHolder.groupNameTv=view.findViewById(R.id.tv);
                view.setTag(textViewHolder);
            }else if (itemViewType==BaseItem.HERO1){
                view=initView(viewGroup,R.layout.hero_item);
            }else if (itemViewType==BaseItem.HERO2){
                view=initView(viewGroup,R.layout.hero_item2);
            }else if (itemViewType==BaseItem.HERO3){
                view=initView(viewGroup,R.layout.hero_item3);
            }else if (itemViewType==BaseItem.HERO4){
                view=initView(viewGroup,R.layout.hero_item4);
            }else {
                view=new View(viewGroup.getContext());
            }
        }
        Object tag = view.getTag();
        BaseItem baseItem = list.get(i);
        if (tag instanceof TextViewHolder){
            TextViewHolder textViewHolder= (TextViewHolder) tag;
            if (baseItem instanceof TextItem){
                TextItem textItem= (TextItem) baseItem;
                textViewHolder.groupNameTv.setText(textItem.getGroupName());
            }
        }else if(tag instanceof HeroViewHolder){
            HeroViewHolder heroViewHolder= (HeroViewHolder) tag;
            if ((baseItem instanceof HeroItem)){
                HeroItem heroItem= (HeroItem) baseItem;
                heroViewHolder.nameTv.setText(heroItem.getHeroName());
                heroViewHolder.genderTv.setText(heroItem.getGender());
                heroViewHolder.wordTv.setText(heroItem.getWord());
            }
        }
        return view;
    }

    private View initView(ViewGroup viewGroup, int layout){
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout, viewGroup, false);
        HeroViewHolder heroViewHolder=new HeroViewHolder();
        heroViewHolder.nameTv= view.findViewById(R.id.nameTv);
        heroViewHolder.genderTv= view.findViewById(R.id.genderTv);
        heroViewHolder.wordTv= view.findViewById(R.id.wordTv);
        view.setTag(heroViewHolder);
        return view;
    }

    @Override
    public int getItemViewType(int position) {
        BaseItem baseItem = list.get(position);
        int type=baseItem.getViewType();
        if(BaseItem.TEXT==type){
            return BaseItem.TEXT;
        }else {
            if(position<list.size()-1){//不是最后一项
                BaseItem beforeItem = list.get(position - 1);
                BaseItem afterItem = list.get(position + 1);
                if (beforeItem.getViewType()==BaseItem.TEXT){
                    if (afterItem.getViewType()==BaseItem.TEXT){
                        return BaseItem.HERO1;//四个角都是圆的
                    }else {
                        return BaseItem.HERO2;//上面两个角是圆的
                    }
                }else {
                    if(afterItem.getViewType()==BaseItem.TEXT){
                        return BaseItem.HERO3;//下面两个角是圆的
                    }else {
                        return BaseItem.HERO4;//没有一个角是圆的
                    }

                }
            }else {//最后一项
                BaseItem beforeItem = list.get(position - 1);
                if (beforeItem.getViewType()==BaseItem.TEXT){
                    return BaseItem.HERO1;
                }else {
                    return BaseItem.HERO3;
                }
            }
        }
    }

    @Override
    public int getViewTypeCount() {
        return 6;
    }

    public static class BaseItem{
        public static final int TEXT=0;
        public static final int HERO=1;
        public static final int HERO1=2;//全圆角
        public static final int HERO2=3;//上半圆角
        public static final int HERO3=4;//下半圆角
        public static final int HERO4=5;//无圆角
        private int viewType;

        public BaseItem(int viewType) {
            this.viewType = viewType;
        }

        public int getViewType() {
            return viewType;
        }

        public void setViewType(int viewType) {
            this.viewType = viewType;
        }
    }

项目的地址

整个项目源码已经放到码云上了点我跳到码云

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:12:56  更:2022-03-06 13:15:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:44:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码