版权声明:
本文为博主学习整理原创文章,如有不正之处请多多指教。
未经博主允许不得转载。
https://mp.csdn.net/postedit/81838179
MVC 架构:
M : model 数据(某种格式的数据) 列: 数组、集合{List Map}
V : View 视图 : 控件
C : Controller 适配器,以某种规则将数据显示到View上
ListView:它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
1)android:id 设置id
2)android:divider 设置分割线
3)android:dividerHeight 设置分割线的高度(单位dp)
ArrayAdapter适配器所生成的列表,每一个项里(item)有且只有一个TextView控件。
// ListView对象绑定XML布局文件中对应的控件
ListView listView = (ListView) findViewById(R.id.lv);
// 向数组中添加显示的数据
String[] movies = new String[] { "我喜爱的电影1", "我喜爱的电影2", "我喜爱的电影3", "我喜爱的电影4","我喜爱的电影5", "我喜爱的电影6", "我喜爱的电影7", "我喜爱的电影8", "我喜爱的电影9","我喜爱的电影10"};
// 创建适配器 ArrayAdapter
ArrayAdapter
this, //当前Activity
android.R.layout. simple_list_item_1, //系统默认的单行布局simple_list_item_2两行
android.R.id.text1,
movies); //需要显示的数据数组
// 设置ListView的适配器
listView.setAdapter(arrayAdapter);
列:布局文件中
注:显示的一行一行的view
Java代码操作:
//声明
private ListView listView;
private Button SimpleAdapterBtn, ArrayAdapterBtn;
//实例化
listView = (ListView) view.findViewById(R.id.lv);
ArrayAdapterBtn = (Button) view.findViewById(R.id.ArrayAdapterBtn);
SimpleAdapterBtn = (Button) view.findViewById(R.id.SimpleAdapterBtn);
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//对按钮设置监听事件
ArrayAdapterBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建一个ArrayAdapter 需要四个参数
// 1、上下文
// 2、引用的布局文件
// 3、引用布局文件的ID
// 4、数据源 (此处为一个循环方法)
ArrayAdapter
R.layout.list_item,R.id.text666,getList());
//设置适配器
listView.setAdapter(arrayAdapter);
}
});
//生成数据M========ArrayAdapter
private List getList(){
List data = new ArrayList<>();
for(int i=1;i<=200;i++){
data.add("这是第"+i+"个item");
}
return data;
}
效果:
上: 下:
SimpleAdapter适配器所生成的列表,每一项(item)中可以有任意个控件,需要自定义布局文件,控件类型可以包括TextView、ImageView、CheckBox等。
// 需显示的数据,图片使用id
int[] intImage = new int[] { R.drawable.ic_launcher,R.drawable.ic_launcher, R.drawable.ic_launcher };
String[] strName = new String[] { "古天乐", "刘德华", "周润发" };
String[] strMsg = new String[] { "什么时候找我拍电影?", "上一次的合作满意吗?","快来吃饭,就差你了!" };
// 使用List对象保存需显示的数据,每一个item中显示的数据使用Map以键值对的形式保存
Listnew ArrayList
for (int i = 0; i < strMsg.length; i++) {
// 需要显示的数据以键值对的形式存入Map中,每个Map就是一个item的数据
Map
map.put("imageId", intImage[i]);
map.put("name", strName[i]);
map.put("msg", strMsg[i]);
// 把Map存入List中
list.add(map);
}
// 创建适配器 SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(
this, //当前Activity
list, //需要显示的数据(格式固定:List
R.layout.activity_item, //显示item的布局文件,一般自定义
new String[] { "imageId", "name", "msg" }, //map中的key字符串数组
new int[] {R.id.imageview, R.id.tv_name, R.id.tv_msg });//item布局中控件的id数组
// ListView对象绑定XML布局文件中对应的控件
ListView listView = (ListView) findViewById(R.id.lv);
// 设置ListView的适配器
listView.setAdapter(simpleAdapter);
列:
//对SimpleAdapterBtn按钮进行监听事件
SimpleAdapterBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//实例化String数据装 生成数据中的map “Key"值 simpleAdapter 需要此参数
String[] from = new String[]{"name","image","sex"};
//实例化int 数据 装布局中对应的ID simpleAdapter 需要此参数
int[] to = new int[]{R.id.name,R.id.img,R.id.sex};
//实例化 SimpleAdapter 需要五个参数
// 1、上下文
// 2、数据源
// 3、寻找布局文件
// 4、map 中的“Key"值
// 5、int中对应的ID
SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(),getdata(),R.layout.simpleadter,from,to);
//设置适配器
listView.setAdapter(simpleAdapter);
}
});
//生成数据M========SimpleAdapter方法
//由于SimpleAdapter中可以装图片、文本数据,所以数据类型为Map
private List女");
}else if(i%6==2){
map.put("image",R.mipmap.fj);
map.put("name", "风姐姐");
map.put("sex","女");
}else if(i%6==3){
map.put("image",R.mipmap.gtl);
map.put("name", "古天乐");
map.put("sex","男");
}else if(i%6==4){
map.put("image",R.mipmap.ldh);
map.put("name", "刘德华");
map.put("sex","男");
}else if(i%6==5){
map.put("image",R.mipmap.zrf);
map.put("name", "周润发");
map.put("sex","男");
}else if(i%6==0){
map.put("image",R.mipmap.zly);
map.put("name", "张靓颖");
map.put("sex","女");
}
data.add(map);
}
return data;
}
BaseAdapter是一个抽象类,是Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter。
//自定义适配器MyAdapter的写法,必须继承BaseAdapter
public class MyAdapter extends BaseAdapter{
//定义存储Item数据的List类型数据:Lsit
private List
//定义当前Context
private Context context;
//定义一个动态加载布局对象
private LayoutInflater inflater;
//自定义适配器的构造方法(需要显示的数据,当前Context)
public MyAdapter(List
this.list = list;
this.context = context;
inflater = LayoutInflater.from(context);
}//获取当前Item的项数
public int getCount() {
return list.size();
}
public Object getItem(int arg0) { //获取索引为arg0的Item项
return list.get(arg0);
}
public long getItemId(int arg0) {//获取索引为arg0的Item项的id
return arg0;}
//获取索引为arg0的Item的布局组件, arg0:获取Item的索引(0开始)
//arg1:获取的Item 布局组件 arg2:获取Item的父容器
public View getView(int position, View view, ViewGroup arg2) {
//声明一个ViewHolder对象
ViewHolder viewHolder = null;
//判断一下当前加载的View是否已加载
if (view == null) {
//实例化ViewHolder对象
viewHolder = new ViewHolder();
//设置view加载布局(当前Item布局,当前Item的父类布局)
view = inflater.inflate(R.layout.activity_item, null);
//ViewHolder对象和Item布局对象一一绑定
viewHolder.image = (ImageView) view.findViewById(R.id.iv);
viewHolder.tv = (TextView) view.findViewById(R.id.tv);
//设置view的Tag(标签):给view添加一组额外的数据
view.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag();//获取viewHolder
}
//获取当前的Item的显示数据
ItemBean itemBean = list.get(position);
//为ViewHolder绑定的控件一一赋值
viewHolder.image.setBackgroundResource(itemBean.getImageId());
viewHolder.tv.setText(itemBean.getMsg());
return view;
}//内部类,用来和Item布局中的控件一一对应,用处:方便赋值,不需要每次访问Item布局文件
class ViewHolder{
private ImageView image;
private TextView tv;}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//和XML布局中的ListVew绑定
lv = (ListView) findViewById(R.id.lv);
//初始化需要显示的数据
list = new ArrayList
list.add(new ItemBean(R.drawable.ic_launcher,"这是系统定义的图标"));
//实例化一个自定义适配器
MyAdapter myAdapter = new MyAdapter(list, this);
//设置ListView的适配器
lv.setAdapter(myAdapter);
OnItemClickListener
当用户点击ListView的项(item)时,会触发此事件。
//和XML布局中的ListVew绑定
lv = (ListView) findViewById(R.id.lv);
//设置ListView的OnItemClickListener监听事件
lv.setOnItemClickListener(new OnItemClickListener() {
//argo:发生选中事件的ListView, arg1:发生选中事件的Item
//arg2:发生选中事件的Item的索引(0开始) arg3:发生选中事件的Item的id
public void onItemClick(AdapterView> arg0, View arg1, int arg2,long arg3) {
Toast.makeText(MainActivity.this, "你点击的是第"+ ++arg2 + "项",
Toast.LENGTH_SHORT).show();}});