您的位置:首页 > 其它

ArrayAdapter, SimpleAdapter 和BaseAdapter的使用范例

2014-09-01 16:06 288 查看
一、ArrayAdapter:最简单地布局,显示一行内容 (可以配上图片文字一起显示)

public class ImageListView extends Activity {
private ListView mListView;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mListView = new ListView(this);
mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item, getData()));//此处采用的是系统提供的样式
setContentView(mListView);
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("百度图片");
data.add("腾讯图片");
data.add("360图片");
return data;
}
}


曾经以为ArrayAdapter只能显示一行文字,后来发现它可以将图片和文字一起显示,不过缺点就是只能定义一项,不能同时定义。

public class ImageListView extends Activity {
private ListView mListView;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mListView = new ListView(this);
<pre name="code" class="java"><span style="white-space:pre">	</span>mListView.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item , R.id.textView , list ));
setContentView(mListView); } } //参数说明:this就不用解释了;R.layout.list_item是我们自己定义的布局,里边可以有图片等,不过只能是固定的,R.id.textView是需要改变的文字id;list就是需要显示的文字集合,同理可以文字不变,改变图片亦可。



二、SimpleAdapter:看名字就知道是简单地布局,扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等。可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示,例如View的Item里有按钮,点击后是没有效果的。
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局imagelayout.xml。

public class ImageListView extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.imagelayout,
new String[]{"title","info","img"},
new int[]{R.id.title,R.id.info,R.id.img});
setListAdapter(adapter);
}
private List<Map<String, Object>> getData() {
List<Map<String, Object>> mList = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "tp");
map.put("info", "fb");
map.put("img", R.drawable.icon);
mList.add(map);

map = new HashMap<String, Object>();
map.put("title", "tp2");
map.put("info", "fb2");
map.put("img", R.drawable.icon2);
mlist.add(map);
return mlist;
}
}


三、BasaAdapter的使用和参数
这是最受欢迎的Adapter吧,当系统开始绘制ListView的时候,首先开始调用getCount()方法,得到它的返回值,这个值就是ListView的长度,然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。如果让getCount()的参数返回为1 ,那么只会显示一行。但如果有1000行,系统会不会绘制一千行呢?肯定不会,那样太消耗内存了,所以会通过convertView和ViewHolder直接导入布局,并且设置控件显示的内容就可以了,View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。如果List中有button,记得提前设置获取焦点:setFoucsable="true"(详细可度娘下)。

继承了BaseAdapter之后需要复写四个方法,分别说明如下:

public int getCount(){
return XX.size();
}<span style="font-family: Arial, Helvetica, sans-serif;">//当系统开始绘制listView的时候便开始调用此方法,返回值就是ListView的长度,如果本来是10行,设置返回值为6,那么就只能显示6行了,一般都会return XX.size()或者XX.length()</span>
public Object getItem(int position){
return XX.get(position);
}//返回当前Item对象的本身,方便在Activity中的onItemClick方法中调用
public long getItemId(int position){
return position;
}//返回当前选择Item的id,方便调用。getItem和getItemId是一对基友关系,前者返回的是对象本身,后者返回的是该对象的索引。
public View getView(int postion , View converView, ViewGroup parent){
return converView;
}//<span style="font-family: Arial, Helvetica, sans-serif;">converView是每一行的View;</span>
一大波代码来袭:

public class ImageListView extends ListActivity {
private List<Map<String, Object>> mData;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getData();
ImageBaseAdapter adapter = newImageBaseAdapter(this);
setListAdapter(adapter);
}
private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "tp");
map.put("info", "fb");
map.put("img", R.drawable.icon);
list.add(map);

map = new HashMap<String, Object>();
map.put("title", "tp1");
map.put("info", "fb2");
map.put("img", R.drawable.icon2);
list.add(map);
return list;
}
protected void onListItemClick(ListView l, View v, int position, long id) {
}
public void showInfo(){
new AlertDialog.Builder(this)
.setTitle("listview")
.setMessage("介绍...")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
public final class ViewHolder{
public ImageView img;
public TextView title;
public TextView info;
public Button viewBtn;
}
public class ImageBaseAdapter extends BaseAdapter{
private LayoutInflater mInflater;
public ImageBaseAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
}
public int getCount() {
return mData.size();
}
public Object getItem(int position) {
return mData.get(position);
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.vlist, null);//注意,这里第一个参数是文件名,而不是ID,小心容易出错
holder.img = (ImageView)convertView.findViewById(R.id.img);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
holder.title.setText((String)mData.get(position).get("title"));
holder.info.setText((String)mData.get(position).get("info"));
holder.viewBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showInfo();
}
});
return convertView;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐