ListView配合安卓适配器Adapter和迭代器Iterator的用法整理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、Adapter

安卓适配器Adapter是AdapterView视图与数据之间的桥梁。可以将较为复杂的数据处理以后绑定到目标的视图上。

以下面的例程为例,解释一下各元素之间的关系:

SiDong


二、Iterator

安卓迭代器Iterator对collection进行迭代,在处理显示数据时,可用于遍历数据,配合Adapter使用效果更佳~

Iterator主要有三个基本操作(摘自JAVA中文API):

  • hasNext:booleanhasNext()

如果仍有元素可以迭代,则返回 true

  • next:

返回迭代的下一个元素。

  • remove:
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。


三、例程

主界面:

<?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:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:text="textchat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <Button
            android:text="videochat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/videochat"
            android:layout_alignParentBottom="true"
            android:layout_toRightOf="@+id/text"
            android:layout_toEndOf="@+id/text" />

        <Button
            android:text="logout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/logout"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

        <Button
            android:text="addfriend"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/videochat"
            android:layout_toRightOf="@+id/videochat"
            android:id="@+id/addFriend"
            android:textSize="14sp" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_above="@+id/text"
            android:id="@+id/chatList">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:text="Chat List"
                    android:layout_width="match_parent"
                    android:id="@+id/chatList_ban"
                    android:textSize="24sp"
                    android:layout_height="40dp"
                    android:textAlignment="center"
                    android:textColor="@color/common_google_signin_btn_text_dark_default"
                    android:textStyle="normal|bold"
                    android:background="@android:color/holo_blue_light" />

                <ListView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:id="@+id/chatList_view"
                    android:divider="@android:color/holo_blue_bright"
                    android:cacheColorHint="@android:color/holo_blue_bright"
                    android:layout_below="@+id/chatList_ban" >



                </ListView>



            </RelativeLayout>
        </LinearLayout>

    </RelativeLayout>
</LinearLayout>

item界面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:id="@+id/listItem"
        android:textSize="20sp" />
</LinearLayout>

主程序:

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_friend);

    /*
        将所读取的对话数据以ListView的形式显示,在View和所获取的Map之间使用了listAdapter处理数据
     */
    Map<String, EMConversation> conversations = EMClient.getInstance().chatManager().getAllConversations();

    //初始化ListView
    listView = (ListView) findViewById(R.id.chatList_view);
    listAdapt = new listAdapter(this, conversations);
    listView.setAdapter(listAdapt);
    ...
}

适配器:

public class listAdapter extends BaseAdapter{


    ArrayList<String> friendName;
    ArrayList<EMConversation> conversation;

    Context context;
    //int position=0;

    public listAdapter(Context context,Map<String,EMConversation> list){

        this.context = context;
        
        friendName=new ArrayList<>(); 
        conversation=new ArrayList<>();

        Iterator iterator= list.entrySet().iterator();
        // Map类中提供entrySet(),这个方法返回Map.Entry实例化后的对象集。
        // Map.Entry类中提供了一个getKey()方法和一个getValue()方法。

        while(iterator.hasNext()){
            Map.Entry entry=(Map.Entry)iterator.next();

            Object key=entry.getKey();
            Object value=entry.getValue();

            friendName.add((String) key);
            conversation.add((EMConversation) value);


        }

    }

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

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

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

    @Override
    public View getView(int position,View convertView,ViewGroup parent){
        // position从0开始
        // convertView即ListView中每一项要显示的view,这里新建了View
        // parent是父窗体ListView
        TextView textView;

        LayoutInflater inflater = LayoutInflater.from(context);//获取主界面的视图
        View view = inflater.inflate(R.layout.list_items, null);//绑定每一项的视图
        textView = (TextView)view.findViewById(R.id.listItem);
        textView.setText(friendName.get(position));

        return view;
    }



}


四、参考资料:

  • http://jingyan.baidu.com/article/4f7d5712c2f80b1a2019270e.html
  • http://www.javaweb.cc/help/JavaAPI1.6/overview-summary.html

一点点个人见解,若有不妥的地方欢迎指出~


Android中的迭代器模式实践指南 本文还有配套的精品资源,点击获取 简介:迭代器模式作为设计模式的一种,使我们能以统一的方式遍历集合而不暴露其内部结构。在Android开发中,该模式特别有用,尤其在管理顺序访问复杂集合数据时。本示例将通过一个 MyApplication 应用来展示迭代器模式的实现应用,包括聚合类、迭代器接口的定义客户类的使用,以便于Android开发者理解并掌握其在实际... 阅读详情

相关推荐

android中 List、Map简单介绍及ArrayAdapter、SimpleAdapter、BaseAdapter简单总结

~~~~我的生活,我的点点滴滴!!

破茧 4531

Android Iterator迭代器

1.Iterator Iterator迭代器是一种用于访问集合的方法,可用于迭代 ArrayList HashSet 等集合。 Iterator为一个接口,它只提供了迭代了基本规则,在JDK中是这样定义的:对 collection 进行迭代的迭代器迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同: ①迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。 ②方法名称得到了改进。 其

zenmela2011的专栏 1339

Android】快速开发偷懒必备,2024年腾讯Android高级面试题及答案

看起来还是挺好的,嗯~至少我自己这么觉得,我个人比较喜欢这种0耦合,每一个库都像可组装拆卸的机关枪一样,拿起来就用。而不是笨重功能繁多的重装坦克。搭配我的得意之作,每次必安利的史上集成最简单侧滑菜单控件。效果如下:无特殊设置,仅仅替换ViewGroup为流式布局,替换Item根布局为我撸的侧滑菜单库,能感受到这种0耦合的库的魅力了么。23333333 。设计思路下面就让我手摸手带大家实现它。先看类图。先简要概括* 我们的顶层接口暴露出两个方法供ViewGroup使用。 是为任意ViewGroup 动态add

m0_57077948的博客 439

android list 替换元素_JDK源码分析-List, Iterator, ListIterator

List 是最常用的容器之一。之前提到过,分析源码时,优先分析接口的源码,因此这里先从 List 接口分析。List 方法列表如下:由于上文「JDK源码分析-Collection」已对 Collection 接口的方法进行了简要分析,而 List 接口继承自 Collection,因此这里只分析一些 List 特有的方法:// 将一个集合的所有元素添加到当前集合的指定位置; boolean add...

weixin_39734458的博客 505

android 遍历子view,android – 如何从RecyclerView获取子视图?

我正试图通过职位来看孩子.点击一个项目时,我可以看到:rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {@Overridepublic void onItemClick(View ...

weixin_39624429的博客 807

遍历listview里面全部(可见不可见)item,从而获取item的信息最简单的方法

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new MyAdapter(doneNumb

灵魂的世界 9436

Android ListView适配器Adapter使用,item的复用ViewHolder优化

概述 数据适配器:由于数据源的多样性及ListView的固定数据格式,需要使用Adapter建立数据ListView的动态适配关系。Adapter解耦了数据的来源显示,降低了程序的耦合性,使之更易扩展。 ListView的缓存机制:如需同时显示5条数据,滑动时最多会同时显示6条数据,因此系统将加载6个item布局。当向上滑动至第一个item不可见时,该item则进入缓存池。当第7

Eczom的博客 1643

android遍历的方法,android中遍历arrayList的四种方法

一.在android中遍历arrayList有以下四种方法:1.实例:package com.mylist.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ArrayListDemo {public static void main(String args[])...

weixin_39609887的博客 583

Iterator-迭代器使用原理

Iterator-迭代器使用与原理,这一篇就够了。

qq_45444058的博客 783

Android设计模式详解之迭代器模式

迭代器模式又称为游标模式,是行为型设计模式;提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示;遍历一个容器对象时;UML类图:迭代器接口,负责定义、访问遍历元素的接口;具体迭代器类,实现迭代器接口,并记录遍历的当前位置;容器接口,负责提供创建具体迭代器角色;具体容器类;迭代器模式发展至今,几乎每一种高级语言都已经内置实现,极少需要自己去实现迭代器;支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系;类文件的增加;ღ( ´・ᴗ・` )

故不积跬步无以至千里 424

Android设计模式源码解析之迭代器(Iterator)模式

1. 模式介绍 模式的定义 迭代器Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 模式的使用场景   Java JDK 1.2 版开始支持迭代器。每一个迭代器提供next()以及hasNext()方法,同时也支持remove()(1.8的时候remov

古道边、半轮月 1248

Android开发-设计模式-迭代器模式(Iterator

迭代器模式又叫游标模式(Cursor),是对象的行为模式。迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集内部的表象。

City_Coder的博客 596

java Iterator学习

迭代器Iterator)   迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。   Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第...

trb333的博客 243

java/android 设计模式学习笔记(20)---迭代器模式

我们这篇博客来介绍一下迭代器模式(Iterator Pattern),又称为游标(Cursor Pattern)模式,是行为型设计模式之一。迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如 Java 中的 List、Map、数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法。如果我们将遍历的方法封装到容器中,那么对于容器类来说就承

Shawn_Dut的专栏 2456

RecyclerView获取某个item的VIewHolder、View为什么会为空

转载 :https://blog.csdn.net/z979451341/article/details/79099201就一句话,这个Item是否可见,可见获取得到,不可见获取为空平常我们使用RecyclerView的findViewHolderForAdapterPosition(int position)获取ViewHolder,使用LayoutManager的findViewByPosit...

一站到底s的博客 1万+

adapter

Adapter

火星男孩的分享空间 372

安卓常见设计模式11------迭代器模式(Kotlin版)

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种遍历集合对象的方法,而无需暴露集合的内部表示。迭代器模式由两个主要角色组成:迭代器Iterator集合(Collection)。

jiet_h的博客 1186

RecyclerView 获取指定位置item的view并获取view的子控件

@Override protected void onResume() { super.onResume(); new Handler().postDelayed(new Runnable() { @Override public void run() { View view = mLayoutManager.findView

刘胡来 5万+

RecycleView获取所有的ViewHolder

获取Viewholder RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(index); 如果holder为空的话,从缓存中取 //缓存池 RecyclerView.RecycledViewPool pool = recyclerView.getRecycledViewPoo...

一品大帅的专栏 8094
上一篇: Java集合框架List,Map,Set等全面介绍+vector VS ArrayList
下一篇: 布局的小功能合集
寺咚
博客等级 码龄12年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值