ListView是Android中用以显示数据的列表控件.对于ListView的数据显示,离不开适配器 Adapter.它起到的作用就是桥接数据源和显示控件,这个工作在ListView.setAdapter()函数中完成.对于ListView来说,数据是按条显示的,每个条称为一个Item , 我们可以定制Item 的样式,然后也是在适配器中完成与ListView的连接。
对于Adapter而言,系统有几种常用的Adapter,我们先来说一下最基本的应用。使用系统的ArrayAdapter。
- 定义一个数组(等下用来显示的数据源)
- 构造一个适配器(Adapter的构造函数含有多个重载)
- 绑定适配器
具体代码可以这么写:
- String[] str = new Sring[] {"1","2","3","4","5"}; //定义数组
- ListView lv = (ListView) findViewById(R.id.listview); //这是你要显示数据的ListView
ArrayAdapter adapter =new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1,str);
/* ArrayAdapter的构造函数很多,这个是最基本的,其中第一个参数为上下文,第二个为Item的布局,此处我写的是Android自带的基本样式,但是要注意自定义样式的话里面应该包含TextView用以显示我们后面定义的字符串数据。第三个参数就是要显示的数据源,按照需求可以自己自定义数据结构。 */
- lv.setAdapter(adapter); //完成适配器绑定
自定义适配器
- 定义一个新的Adapter类,例如MusicAdapter
packagecom.example.zeashon.a20160728;
importandroid.content.Context;
importandroid.media.MediaRouter;
importandroid.text.Layout;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.Adapter;
importandroid.widget.BaseAdapter;
importandroid.widget.TextView;
importjava.util.List;
/**
*CreatedbyZeashonon2016/7/30.
*/
publicclassMusicAdapterextendsBaseAdapter{
privateContextcontext;
privateList<MusicInfo>list;
privateStringTAG="MusicAdapter";
publicMusicAdapter(Contextcontext,List<MusicInfo>list){
super();
this.context=context;
this.list=list;
}
@Override
publicintgetCount(){//指定数据源长度
returnlist.size();
}
@Override
publicObjectgetItem(intposition){//指定位置的数据
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
finalHoldhold;
if(convertView==null){//子项布局为空(当前内存中没有缓冲)
Log.d("train","convertView==null");
convertView=LayoutInflater.from(context).inflate(R.layout.music_list_item,parent,false);
convertView=View.inflate(context,R.layout.music_list_item,null);//指定子项使用的布局
hold=newHold();//建立子项布局中的控件对应关系
hold.name=(TextView)convertView.findViewById(R.id.musicname);
hold.player=(TextView)convertView.findViewById(R.id.player);
convertView.setTag(hold);//将“子项布局中的控件对应关系”保存到子项控件中,在复用时直接取出使用
}else{//当前缓存中存在子项布局(已经出屏的子项布局)
Log.d("train","reuse");
hold=(Hold)convertView.getTag();//取出之前缓存的“子项布局中的控件对应关系”
}
/*对子项布局中的控件填充数据*/
MusicInfomusicInfo=list.get(position);
hold.name.setText(musicInfo.getMusicName());
hold.player.setText(musicInfo.getPlayer());
Log.e(TAG,"settext");
returnconvertView;
}
/**
*“子项布局中的控件对应关系”
*/
privateclassHold{
TextViewname;
TextViewplayer;
}
}
- 如果有需要自定义数据结构则参照下面的MusicInfo类
packagecom.example.zeashon.a20160728;
/**
*CreatedbyZeashonon2016/7/30.
*/
publicclassMusicInfo{
privateStringMusicName;
privateStringPlayer;
publicMusicInfo(StringMusicName,StringPlayer)
{
super();
this.MusicName=MusicName;
this.Player=Player;
}
publicStringgetMusicName(){
returnMusicName;
}
publicStringgetPlayer(){
returnPlayer;
}
publicvoidsetMusicName(StringMusicName){
this.MusicName=MusicName;
}
publicvoidsetPlayer(StringPlayer){this.Player=Player;}
}
- Activity中实现绑定
packagecom.example.zeashon.a20160728;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.Button;
importandroid.widget.ListView;
importandroid.widget.Toast;
Importjava.util.ArrayList;
Importjava.util.List;
publicclassTest02extendsAppCompatActivity{
privateButtonmSearch;
privateListViewmListView;
privateMusicAdaptermAdapter;
privateStringTAG="Zeashon";
Intentintent;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test02);
intent=this.getIntent();
if(intent!=null){
Stringname=intent.getStringExtra("name");
Toast.makeText(this,"hello"+name,Toast.LENGTH_LONG).show();
}
List<MusicInfo>list=newArrayList<MusicInfo>();
for(inti=0;i<20;i++){//设置数据源
list.add(newMusicInfo("第"+i+"条",i+""));
}
mListView=(ListView)findViewById(R.id.musiclist);
mSearch=(Button)findViewById(R.id.search_btn);
mSearch.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
mSearch.setVisibility(View.GONE);
mListView.setVisibility(View.VISIBLE);
}
});
//设置数据源
mAdapter=newMusicAdapter(getApplicationContext(),list);
mListView.setAdapter(mAdapter);
//设置数据项点击监听
mListView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){
Log.d("train","index:"+position);
Log.d(TAG,parent.getClass().getSimpleName());
MusicInfomusicInfo=(MusicInfo)parent.getAdapter().getItem(position);
Toast.makeText(Test02.this,musicInfo.getMusicName(),Toast.LENGTH_SHORT).show();
}
});
}
}
//提醒:
//ListView无法显示数据可能的原因:
//1.数据获取和适配器绑定的顺序出错,应先获取数据,再绑定适配器; 2. 字体颜色与背景色相同
为了学习相关知识而做的音乐播放器DEMO
如果帮到你,欢迎+Star
github:https://github.com/Zeashon/MusicPlayer