Android中Adapter初步的学习

在学习adapter之前首先我们得先介绍Listview
ListView控件简介
ListView是Android中最重要的控件之一。ListView是一套视图组件。通常以列表的形式在客户端显示一些列表选项。一个ListView,通常有三个重要的构成部分:ListView控件本身、ListView中的Item界面布局和需要在ListView中显示的数据。

ListView控件工作原理
为了提升ListView的性能,在设计ListView时,禁用了其addView方法。ListView被设计为必须使用适配器为其本身提供加载了数据的item界面对象。适配器的主要工作是加载Item布局,读取指定位置的数据并将数据写入到Item布局,返回给ListView。依其原理,ListView的实现步骤可以概括为:
1、创建ListView布局
2、创建Item布局
3、获取数据集
4、创建适配器
5、为ListView控件设置适配器

什么事适配器:适配器就是将源对象转换为目标接口。

这里写图片描述

ArrayAdapter适配器的使用

ArrayAdapter是Android中最简单的通用适配器,用于为ListView提供承载简单文本数据的Item界面。ArrayAdapter的数据源必须是数组或简单的List集合。其加载的item布局中必须包含至少一个TextView控件,数据源中的数据项,将显示在item界面中的TextView控件里。

ArrayAdapter
-最简单的适配器,用于为ListView提供承载简单数据的item界面
-其数据源必须是数组或简单的List集合
-其加载的item布局中必须包含至少一个TextView,数据源中的数据将逐条显示在每一个itemView的TextView空间中

ArrayAdapter的构造方法
-ArrayAdapter(Context context,int layoutRes)
-ArrayAdapter(Context context,int layoutRes,int textViewResId)
-ArrayAdapter(Context context,int layoutRes,List data)
-ArrayAdapter(Context context,int layoutRes,T[] data)
-ArrayAdapter(Context context,int layoutRes,int textViewResId,List data)
-ArrayAdapter(Context context,int layoutRes,int textViewResId,T[] data)

Context context:场景对象(对资源的加载都需要context来完成)
int layoutRes:Item界面布局id
int textViewResId:布局中TextView的id
T[] data:数据

适配器模式概述

ListView的设计中引入了适配器模式。所谓适配器模式是指将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能在一起工作。适配器模式中的三个主要角色是:目标接口、源对象和适配器。

自定义Adapter

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //加载item到view
        View v = inflater.inflate(R.layout.item, null);
        TextView tvName = (TextView) v.findViewById(R.id.tv_Name);
        TextView tvAlbum = (TextView) v.findViewById(R.id.tv_Album);
        TextView tvArtist = (TextView) v.findViewById(R.id.tv_Artist);
        TextView tvDurstion = (TextView) v.findViewById(R.id.tv_Duration);
        //根据位置从集合中获取一条数据
        Music m = music.get(position);
        //将数据加写在item view上
        tvName.setText(m.getName());
        tvAlbum.setText(m.getAlbum());
        tvArtist.setText(m.getArtist());
        tvDurstion.setText(m.getDuration());
        //返回绑定了数据的item view
        return v;
    }

ListView被设计为必须使用Adapter接口实现列表项的加载和显示。此处即采用了适配器模式。Adapter接口为目标接口,需要在ListView中显示的数据集对象为源对象,为实现将数据集中数据按ListView规定的方式(Adapter接口)提供给ListView,需要定义适配器,将数据源对象转为可被ListView接受的目标接口对象。

在Android中,除了使用通用适配器之外,我们还可以通过继承Adapter接口的实现类BaseAdapter的方式来自定义适配器。BaseAdapter中有四个抽象方法必须被实现。其中与列表项显示相关的方法有两个:getCount()方法和getView(int position,View convertView,ViewGroup parent)。其中getCount方法返回数据集长度。而getView方法的作用主要是根据参数position,从数据集中获取指定位置的数据,并将之加载在item界面上返回给ListView。

BaseAdapter
·Adapter接口的实现类
·包含四个抽象方法:
- int getCount()
返回数据集的尺寸
- View getView(int position, View convertView, ViewGroup parent)
根据指定位置,取出数据集中的某条数据,显示在item界面之后再返回给ListView。
- Object getItem(int position)
返回数据项本身
- getItemId(int position)
返回数据的Id(如果没有id就返回position)
参数
int position 该视图在适配器数据中的位置
View convertView 回收区,可重复利用的Item
ViewGroup parent 此视图最终会被附加到的父级视图

ListView优化

ListView在加载列表项时采用了随用随取的原则。即无论数据集中实际的数据条数是多少,ListView只会加载当前需要显示的几条数据。当用户通过滑动ListView来获取其他数据时,才会根据需要加载新的数据。而且当有item界面被移出ListView显示范围后,ListView会将该Item界面通过参数convertView回传到getView方法中,以便重用。在创建自定义适配器时可以利用convertView来优化ListView的性能。
这里写图片描述
主要优化:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //加载item到view
        ViewHolder holder;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.item, null);
            holder = new ViewHolder();
            holder.tvName = (TextView) convertView.findViewById(R.id.tv_Name);
            holder.tvAlbum = (TextView) convertView.findViewById(R.id.tv_Album);
            holder.tvArtist = (TextView) convertView.findViewById(R.id.tv_Artist);
            holder.tvduration = (TextView) convertView.findViewById(R.id.tv_Duration);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        //根据位置从集合中获取一条数据
        Music m = music.get(position);
        //将数据加写在item view上
        holder.tvName.setText(m.getName());
        holder.tvAlbum.setText(m.getAlbum());
        holder.tvArtist.setText(m.getArtist());
        holder.tvduration.setText(m.getDuration());
        //返回绑定了数据的item view
        return convertView;
}

ListView的列表项单击事件

ListView最重要的事件之一是列表项单击事件。可以通过为ListView设置OnItemClickListener监听器的方式,监听列表项单击事件。当ListView的某个列表项被单击时,会回调监听器的onItemClick方法,并将被单击项的索引位置和id作为参数传递到该事件处理方法中。需要注意的是如果需要通过适配器获取被选中项的数据信息,需要重写适配器的getItem和getItemId方法。

实例演示:

效果图:
这里写图片描述
测试效果:
这里写图片描述
Activity:
Music:

package com.cainiao.adapter;

public class Music {
    private int id;
    private String name;
    private String album;
    private String artist;
    private String duration;
    private String musicPath;
    private String albumPath;

    public Music() {
        super();
    }

    public Music(int id, String name, String album, String artist,
            String duration, String musicPath, String albumPath) {
        super();
        this.id = id;
        this.name = name;
        this.album = album;
        this.artist = artist;
        this.duration = duration;
        this.musicPath = musicPath;
        this.albumPath = albumPath;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getDuration() {
        return duration;
    }

    public void setDuration(String duration) {
        this.duration = duration;
    }

    public String getMusicPath() {
        return musicPath;
    }

    public void setMusicPath(String musicPath) {
        this.musicPath = musicPath;
    }

    public String getAlbumPath() {
        return albumPath;
    }

    public void setAlbumPath(String albumPath) {
        this.albumPath = albumPath;
    }

    @Override
    public String toString() {
        return "Music [id=" + id + ", name=" + name + ", album=" + album
                + ", artist=" + artist + ", duration=" + duration
                + ", musicPath=" + musicPath + ", albumPath=" + albumPath + "]";
    }


}

MusicBiz:

package com.cainiao.adapter;

import java.util.ArrayList;

public class MusicBiz {
    public static ArrayList<Music> getMusic(int poge){
        ArrayList<Music> musics = new ArrayList<Music>();
        int i = (poge - 1) * 20 + 1;
        int len = i + 20;
        for (; i < len; i++) {
            Music m = new Music();
            m.setId(i);
            m.setName("歌曲:" + i);
            m.setAlbum("专辑:" + i);
            m.setAlbumPath("http://baike.bdimg.com/static/wiki-lemma/widget/lemma_content/mainContent/summaryPicture/resource/img/icon_9f71d87.png" + i+".jpg");
            m.setDuration("4:04");
            m.setArtist("古巨基");
            m.setMusicPath("http://bd.kuwo.cn/yinyue/6307967?from=baidu#"+i+"mp3");
            musics.add(m);
        }
        return musics;
    }
}

MusicAdapter:

package com.cainiao.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MusicAdapter extends BaseAdapter {
    private ArrayList<Music> music;
    private LayoutInflater inflater;

    public MusicAdapter(Context context,ArrayList<Music> music) {
        if(music != null){
        this.music = music;
        }else{
            music = new ArrayList<Music>();
        }
        this.inflater = LayoutInflater.from(context);
    }

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

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

    @Override
    public long getItemId(int position) {
        return music.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //加载item到view
        ViewHolder holder;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.item, null);
            holder = new ViewHolder();
            holder.tvName = (TextView) convertView.findViewById(R.id.tv_Name);
            holder.tvAlbum = (TextView) convertView.findViewById(R.id.tv_Album);
            holder.tvArtist = (TextView) convertView.findViewById(R.id.tv_Artist);
            holder.tvduration = (TextView) convertView.findViewById(R.id.tv_Duration);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        //根据位置从集合中获取一条数据
        Music m = music.get(position);
        //将数据加写在item view上
        holder.tvName.setText(m.getName());
        holder.tvAlbum.setText(m.getAlbum());
        holder.tvArtist.setText(m.getArtist());
        holder.tvduration.setText(m.getDuration());
        //返回绑定了数据的item view
        return convertView;
        /*//加载item到view
        View v = inflater.inflate(R.layout.item, null);
        TextView tvName = (TextView) v.findViewById(R.id.tv_Name);
        TextView tvAlbum = (TextView) v.findViewById(R.id.tv_Album);
        TextView tvArtist = (TextView) v.findViewById(R.id.tv_Artist);
        TextView tvDurstion = (TextView) v.findViewById(R.id.tv_Duration);
        //根据位置从集合中获取一条数据
        Music m = music.get(position);
        //将数据加写在item view上
        tvName.setText(m.getName());
        tvAlbum.setText(m.getAlbum());
        tvArtist.setText(m.getArtist());
        tvDurstion.setText(m.getDuration());
        //返回绑定了数据的item view*/       
    }

    class ViewHolder{
        private TextView tvName,tvAlbum,tvArtist,tvduration;
    }

}

MainActivity

package com.cainiao.adapter;


import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.app.Activity;

public class MainActivity extends Activity {
    private ListView lvMusic;
    private MusicAdapter adapter;
    private int poge;
    private void  setupView(){
        lvMusic = (ListView) findViewById(R.id.listView);
        poge = 1;
        adapter = new MusicAdapter(this, MusicBiz.getMusic(poge));
        lvMusic.setAdapter(adapter);
    }
    private void addOnClick(){
        lvMusic.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                Log.i("Info", "position:"+position+"id:"+id);
                Music m = (Music) adapter.getItem(position);
                Log.d("Info", m.toString());
            }
        });
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupView();
        addOnClick();
    }


}

XML布局:
activity-main.xml

<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"
    tools:context=".MainActivity" >

    <ListView 
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</RelativeLayout>

item.xml

<?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"
    android:orientation="horizontal" >
    <ImageView 
        android:id="@+id/iv_image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/ic_launcher"
        />
    <TableLayout 
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:stretchColumns="*"
        >
        <TableRow 
            android:layout_height="0dp"
            android:layout_weight="1.0">
            <TextView 
                android:id="@+id/tv_Name"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:textSize="25sp"/>
            <TextView 
                android:id="@+id/tv_Album"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:textSize="25sp"/>
        </TableRow>
        <TableRow 
            android:layout_height="0dp"
            android:layout_weight="1.0">
            <TextView 
                android:id="@+id/tv_Artist"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:textSize="25sp"/>
            <TextView 
                android:id="@+id/tv_Duration"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:textSize="25sp"/>
        </TableRow>
    </TableLayout>
</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值