自定义适配器(Adapter)的使用

在实际应用中常常需要用到自定义的适配器来显示视图比如qq好友列表等等,

自定义适配器(Adapter)的使用_第1张图片

对于这样的视图需求我们可以简单分析下所需要的内容。首先这个界面需要一个ListView。而每一个item需要有ImageView,TextView。而这需要适配器来关联item。

首先需要listView


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/user_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#eeeeee"
        android:dividerHeight="10dp">
    ListView>
LinearLayout>

对于要显示的内容需要封装一个类User

public class User {
    //头像
    private int icon;
    //昵称
    private String nick;
    //签名
    private String sign;

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getNick() {
        return nick;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public User(int icon, String nick, String sign) {
        this.icon = icon;
        this.nick = nick;
        this.sign = sign;
    }
}

接下来就是自定义适配器了,这个adapter需要继承自BaseAdapter

public class UserAdapter extends BaseAdapter {
    private List list ;
    //布局加载器:将xml转为View对象RelativeLayout
    private LayoutInflater mInflater;
    public UserAdapter(Context context , List list){
        this.list = list;
        //初始化布局加载器
        mInflater = LayoutInflater.from(context);
    }
    //配置显示的总item数量
    @Override
    public int getCount() {
        return list == null?0:list.size();
    }
    //按照位置获取数据对象
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    //根据位置获取item的id
    @Override
    public long getItemId(int position) {
        return position ;
    }
    //每个item的显示效果
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //加载每个item的布局对象(将item_user_layout转为RelativeLayout对象)
        View layout = mInflater.inflate(R.layout.item_user_layout,null);
        //初始化布局中的元素
        ImageView ivIcon = layout.findViewById(R.id.item_icon);
        TextView tvNick = layout.findViewById(R.id.item_nick);
        TextView tvSign = layout.findViewById(R.id.item_sign);
        //获取数据显示内容(数据绑定,将数据显示到布局中)
        User u = list.get(position);
        ivIcon.setImageResource(u.getIcon());
        tvNick.setText(u.getNick());
        tvSign.setText(u.getSign());

        return layout;
    }
}




#### 对于item显示需要用到对应的布局,尤其是需要使用布局加载器 LayoutInflater来加载对应的布局```
"http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    "@+id/item_icon"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:src="@drawable/i1"/>
    "@+id/item_nick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/item_icon"
        android:text="ABC"
        android:textSize="20sp"
        android:layout_marginLeft="5dp"
        />
    "@+id/item_sign"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/item_icon"
        android:layout_alignLeft="@id/item_nick"
        android:text="ABC"
        android:textSize="20sp"
        android:maxLines="3"
        android:ellipsize="end"
        />



当所有的东西准备好之后我们就需要在MainActivity内去加载这些数据了,特别是需要数据源

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView userList = findViewById(R.id.user_list);
        //初始化数据
        List list = new ArrayList<>(13);

            ***//通过资源名称加载资源id
            //资源名称(不要后缀名),资源类型,资源所在的包名(R的包名就是应用包名)
        int resId1 = getResources().getIdentifier("i1","drawable","com.xykj.zdyadapter");***
        User u1 = new User(resId1,"轩辕","即黄帝(公元前2717年-公元前2599年):古华夏部落联盟首领,中国远古时代华夏民族的共主。五帝之首。被尊为中华“人文初祖”。据说他是少典与附宝之子,本姓公孙,后改姬姓,故称姬轩辕。居轩辕之丘,号轩辕氏,建都于有熊,亦称有熊氏。也有人称之为“帝鸿氏”。");
        list.add(u1);
        int resId2 = getResources().getIdentifier("i2","drawable","com.xykj.zdyadapter");
        User u2 = new User(resId2,"端木","端木姓为汉字复姓。端木此姓相当的古老,自东周时期便有此姓,据元和姓纂记载,端木一姓的祖宗为孔子弟子端木赐(即子贡),系出于卫国。端木姓分布相当的广,但后来大多改姓为端姓、木姓、沐姓,故今日已不多见。");
        list.add(u2);
        int resId3 = getResources().getIdentifier("i3","drawable","com.xykj.zdyadapter");
        User u3 = new User(resId3,"司马","司马(sī mǎ):西晋国姓,中华姓氏之一,复姓。源于西周,以官职为姓。西周始置,司马与司徒、司空并称“三有司”。在宋版《百家姓》中排序为第四百一十位。");
        list.add(u3);
        int resId4 = getResources().getIdentifier("i4","drawable","com.xykj.zdyadapter");
        User u4 = new User(resId4,"上官","上官姓在中国的大陆和台湾省都没有列入百家姓前三百位,在宋版《百家姓》中排序为第四百一十一位,新姓氏人口排序第510位,约有7.5万余人。");
        list.add(u4);
        int resId5 = getResources().getIdentifier("i5","drawable","com.xykj.zdyadapter");
        User u5 = new User(resId5,"欧阳","欧阳姓,中华姓氏之一,为汉族复姓之首。据2014年统计,欧阳姓为324万。在中国排86位。");
        list.add(u5);
        int resId6 = getResources().getIdentifier("i6","drawable","com.xykj.zdyadapter");
        User u6 = new User(resId6,"慕容","慕容姓《三国志·鲜卑传》中提到,汉桓帝时,鲜卑分为中、东、西三部,中部大夫柯最阙,居慕容寺。而从《通志·氏族略》的记载上考究,慕容氏出自中古时期,部族首领高辛氏的后裔,建立鲜卑国,自言慕二仪(天地)之道,继三光(日、月、星)之容,因此以慕容为姓,称为慕容氏。历史上的鲜卑族在今内蒙西拉木伦河与洮儿河之间。慕容氏的发源地和老家便在这里。");
        list.add(u6);
        int resId7 = getResources().getIdentifier("i7","drawable","com.xykj.zdyadapter");
        User u7 = new User(resId7,"司空","司空是中国古代官名。西周始置,位次三公,与六卿相当,与司马、司寇、司士、司徒并称五官,掌水利、营建之事,金文皆作司工。春秋、战国时沿置。是周代掌管当时代表最先进科学技术水平的工部的手工业制造官员。汉朝本无此官,成帝时改御史大夫为大司空,但职掌与周代的司空不同。司空亦为中国姓氏之一。");
        list.add(u7);
        int resId8 = getResources().getIdentifier("i8","drawable","com.xykj.zdyadapter");
        User u8 = new User(resId8,"东皇","东皇太一是《九歌》体系中所祭祀的天帝、至高神。“东皇太一”与汉武帝祭祀的至高神“太一神”、汉代之后的文献里记载的“泰一”、“泰皇”、“泰壹氏”等,均有关。");
        list.add(u8);
        int resId9 = getResources().getIdentifier("i9","drawable","com.xykj.zdyadapter");
        User u9 = new User(resId9,"刑天","是中国古代神话传说人物之一,和黄帝争位。据《山海经·海外西经》当中记载:“ 刑天与帝至此争神,帝断其首,葬之於常羊之山,乃以乳为目,以脐为口,操干戚以舞。");
        list.add(u9);
        int resId10 = getResources().getIdentifier("i10","drawable","com.xykj.zdyadapter");
        User u10 = new User(resId10,"蚩尤","蚩尤,是上古时代九黎氏族部落联盟的首领,骁勇善战,相传蚩尤是牛图腾和鸟图腾氏族的首领,有说是和炎帝同属一个部落。他有兄弟八十一人,个个本领非凡。");
        list.add(u10);
        int resId11 = getResources().getIdentifier("i11","drawable","com.xykj.zdyadapter");
        User u11 = new User(resId11,"应龙","应龙是古代中国神话传说中一种有翼的龙,又名飞龙,亦作黄龙,另有学者推测应龙以庚辰为名;本居于天,曾作为黄帝大将斩杀蚩尤、夸父,曾以尾画地成江,助大禹治水,擒获无支祁。");
        list.add(u11);
        int resId12 = getResources().getIdentifier("i12","drawable","com.xykj.zdyadapter");
        User u12 = new User(resId12,"李牧","李牧是战国末年东方六国最杰出的将领。 [1]  深得士兵和人民的爱戴,有着崇高的威望。在一系列的作战中,他屡次重创敌军而未尝败,显示了高超的军事指挥艺术。");
        list.add(u12);
        int resId13 = getResources().getIdentifier("i13","drawable","com.xykj.zdyadapter");
        User u13 = new User(resId13,"白起","白起是继中国历史上自孙武、吴起之后又一个杰出的军事家、统帅,《千字文》将他与廉颇、李牧、王翦并称为战国四大名将,位列战国四大名将之首。");
        list.add(u13);

        //创建适配器
        UserAdapter adapter = new UserAdapter(MainActivity.this,list);
        userList.setAdapter(adapter);
    }
}

需要注意的是这种显示的姓名以及简介都是不一样的内容,因此不建议使用数组进行封装。到此所有的数据都已经被组装完毕,可以看看运行效果

自定义适配器(Adapter)的使用_第2张图片

需要注意的是文本显示的内容根据个人喜好可以自行设定,当显示的内容较多时ListView会自带滚动条效果而不需要自己再去创建一个滚动条。

如果想实现qq好友一样的列表用这个方法还不够,这个以后再讨论。

你可能感兴趣的:(自定义适配器(Adapter)的使用)