二、使用simpleadapter(自定义adapter,同一列具有图片、文字、按钮)
①SimpleAdapterActivity.java
package com.week4.simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import com.anjoyo.as.chap04.exam02.R;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.app.ListActivity;
public class SimpleAdapterActivity extends ListActivity {
//本身就是一个list,所以onCreate里不需要setContentView(因为继承自ListActivity)
/* 数据源:一个存放多个Map的ArrayList */
private ArrayList<HashMap<String, Object>> dataList; //数据源
HashMap<String, Object> map; //数据源的内容
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.array_adapter);
//准备好v
//2.准备数据源
dataList = new ArrayList<HashMap<String, Object>>(); //数据源初始化(分配空间)
/* 生成一个50项的数据源 */
for (int i = 1; i <= 50; i++) {
map = new HashMap<String, Object>(); //对每个数据源的内容初始化,即分配空间
//为map填充内容
map.put("img", R.drawable.ic_launcher);
map.put("text", "第" + i + "项文本信息");
map.put("cbx", ""); /* CheckBox后显示的文本信息,此时为空*/
dataList.add(map); //将map内容添加进数据源中
}
//3.实例化SimpleAdapter(this指上下文【此页面】,数据源,数据源要插入的页面,把img插入到img控件、text与cbx类似、不能对应错)
SimpleAdapter adapter = new SimpleAdapter(this, dataList,R.layout.simple_adapter_item,
new String[] {"img", "text", "cbx" },
new int[] {R.id.img, R.id.text, R.id.cbx });
//4.真正进行数据适配并加载;
//由于使用了ListActivity,所以可以直接使用Activity本身的setListAdapter方法
this.setListAdapter(adapter);
}
//处理用户点击选择事件,如果列表项中有可点击的控件,那么必须将这些控件设为不能获得焦点。(Android:focusable=“false”和And=“false”roid:focusableTouchmode==“false”)
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast.makeText(getApplicationContext(), "第"+(position+1)+"项被点击!", 1).show();
}
}
②simple_adapter_item.xml:(List每个选项的布局,不同的内容插入到不同的控件之中)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:contentDescription="@drawable/ic_launcher" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/img"
android:textColor="#00ff00"
android:textSize="18sp" />
<!-- 设置CheckBox为不能获得焦点 -->
<CheckBox
android:id="@+id/cbx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/text"
android:focusable="false"
android:focusableInTouchMode="false" />
</RelativeLayout>
三、完全自定义adapter(只有一张图片)
①adsfadsdf.java(一个举例、模板)
package com.anjoyo.as.chap04.exam03;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public class adsfadsdf extends BaseAdapter { //自定义adapter(继承BaseAdapter需要实现以下方法)
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0; //网格布局的数量
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null; //网格布局一个选项内的所有元素,即选定一个选项
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0; //网格布局每一个选项所对应的的编号(即第几个选项,并将编号返回)
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return null; //网格布局所对应的的页面,position:页面选项所对应的位置;convertview:网 格布局所对应的的页面
}
}
②CustomAdapterActivity .java
package com.anjoyo.as.chap04.exam03;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
import android.app.Activity;
public class CustomAdapterActivity extends Activity {
GridView gridview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_adapter); //加载网格布局
gridview=(GridView) findViewById(R.id.gridview);
//将自定义的Adapter实例化,初始化
ImageAdapter imageAdapter=new ImageAdapter(this);//(实现上下文的传递,即把此页面传递给 adapter)
//真正完成数据适配并显示。(把适配器加载到网格布局中并实现adapter的其它方法)
gridview.setAdapter(imageAdapter);
}
}
③ImageAdapter.java
package com.anjoyo.as.chap04.exam03;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter { //自定义adapter
//准备数据源,这是一组要显示在GridView中一组图片
private Integer[] datalist= {R.drawable.def_0,R.drawable.def_1,R.drawable.def_2,
R.drawable.def_3,R.drawable.def_4,R.drawable.def_5,R.drawable.def_6,
R.drawable.def_7,R.drawable.def_0,R.drawable.def_1,R.drawable.def_2,
R.drawable.def_3,R.drawable.def_4,R.drawable.def_5,R.drawable.def_6,
R.drawable.def_7,R.drawable.def_0,R.drawable.def_1,R.drawable.def_2,
R.drawable.def_3,R.drawable.def_4,R.drawable.def_5,R.drawable.def_6,
R.drawable.def_7,R.drawable.def_0,R.drawable.def_1,R.drawable.def_2,
R.drawable.def_3,R.drawable.def_4,R.drawable.def_5,R.drawable.def_6,
R.drawable.def_7};
private Context context;
//构造方法,实现上下文的传递,实现类的初始化;
public ImageAdapter(Context c) {
context=c;
}
//返回填充的数据项的个数,必须返回真实
@Override
public int getCount() {
// TODO Auto-generated method stub
return datalist.length; //填充的个数即数据源的大小
}
//根据position返回某一项数据(在这个例子,返回的是一张图片)
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datalist[position]; //获得第几个数据源所对应的选项
}
//根据position返回某一项的行ID
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//getView是自定义Adapter里最重要的方法,根据position返回某一项的界面View,显示给用户。
//参数position,数据项的索引,从0开始;
//参数convertView,要重用的view,每次要检查他是否为null,如果不是,用直接重用它;如是null则新建一个view(缓存机制)
//参数parent,convertView所显示在的父view;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//1.准备v
ImageView img;
if(convertView==null)
{ //如是null则新建一个view(缓存机制)
img=new ImageView(context);
img.setLayoutParams(new GridView.LayoutParams(90,90));//图片框的大小;
img.setPadding(10, 10, 10, 10);//图片周围的间距;
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
}else {
img=(ImageView)convertView;
}
//2.设置img的具体的图片(根据position读取到的),每次读取一张;
img.setImageResource(datalist[position]);
//3.img完成了准备工作,可以返回img给界面窗体;
return img;
}
}
④custom_adapter.xml:(网格布局)
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
三、完全自定义adapter(有文字、图片等)
①MainActivity.java:
package com.oracle.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
import com.oracle.adapter.MyAdapter;
public class MainActivity extends Activity {
ListView lv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv1=(ListView) this.findViewById(R.id.lv1);
MyAdapter myadapter=new MyAdapter(); //初始化adapter
lv1.setAdapter(myadapter); //数据适配,并实现adapter的方法
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
②MyAdapter.java:
package com.oracle.adapter;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.oracle.activity.R;
import com.oracle.entity.User;
public class MyAdapter extends BaseAdapter {
//数据源list
List<User> list=new ArrayList<User>(); //数据源
public MyAdapter(){
//为数据源增添内容
User u1=new User("李健","<<贝加尔湖畔>>");
User u2=new User("韩红","<<莫尼山>>");
User u3=new User("王菲","<<传奇>>");
User u4=new User("阿杜","<<离别>>");
User u5=new User("德德玛","<<苍天般的阿拉善>>");
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);
list.add(u5);
}
@Override
public int getCount() {
//返回适配的数据的总个数
return list.size();
}
@Override
public Object getItem(int position) {
//返回当前指定位置的一条数据
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//先得到一个布局加载器inflater
LayoutInflater inflater=(LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//再通过inflater去加载自定义的列表项布局
View view=inflater.inflate(R.layout.items,null);
TextView author=(TextView) view.findViewById(R.id.textView1);
author.setText(list.get(position).getAuthor()); //把数据源上的内容填充到选项上
TextView song=(TextView) view.findViewById(R.id.textView2);
song.setText(list.get(position).getSong());
return view;
}
}
③User.java:(封装类)
package com.oracle.entity;
public class User {
private String author;
private String song;
private String pic;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String author, String song, String pic) {
super();
this.author = author;
this.song = song;
this.pic = pic;
}
public User(String author, String song) {
super();
this.author = author;
this.song = song;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getSong() {
return song;
}
public void setSong(String song) {
this.song = song;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
}
④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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</RelativeLayout>
⑤items.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"
>
<TextView
android:id="@+id/textView1"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="TextView"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="TextView"
android:gravity="right"/>
<ImageView
android:id="@+id/imageView1"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
</LinearLayout>