ListView和Adapter的学习

本文详细介绍了Android中ListView的使用和Adapter的工作原理,通过实例展示了如何使用ArrayAdapter以及自定义Adapter来展示数据。内容包括ArrayAdapter的构造函数、自定义Adapter的实现以及ListView的Item点击事件处理。此外,还提到了ListView显示问题的常见原因及解决建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListViewAndroid中用以显示数据的列表控件.对于ListView的数据显示,离不开适配器 Adapter.它起到的作用就是桥接数据源和显示控件,这个工作在ListView.setAdapter()函数中完成.对于ListView来说,数据是按条显示的,每个条称为一个Item , 我们可以定制Item 的样式,然后也是在适配器中完成与ListView的连接。

对于Adapter而言,系统有几种常用的Adapter,我们先来说一下最基本的应用。使用系统的ArrayAdapter

  1. 定义一个数组(等下用来显示的数据源)
  2. 构造一个适配器(Adapter的构造函数含有多个重载)
  3. 绑定适配器

具体代码可以这么写:

  1. String[] str = new Sring[] {"1","2","3","4","5"};   //定义数组
  2. 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用以显示我们后面定义的字符串数据。第三个参数就是要显示的数据源,按照需求可以自己自定义数据结构。 */

  1. lv.setAdapter(adapter);   //完成适配器绑定

自定义适配器

  1. 定义一个新的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;

}

}

  1. 如果有需要自定义数据结构则参照下面的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;}

}

  1. 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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值