ListView以及Adapter的用法
来源:互联网 发布:mac有淘宝吗 编辑:程序博客网 时间:2024/06/05 14:40
AdapterView具有如下属性:
继承了ViewGroup
可以包括多个列表项,并将多个列表项以合适的形式显示出来。
显示多个列表项,由Adapter提供。调用AdapterView的setAdapter(Adapter)
方法设置Adapter即可。
ListView和ListActivity
ListView的实现第一种方式:继承Activity
1)在布局文件中配置ListView的属性。
android:entries=”@array/courses”:设置显示数组数据,
android:divider=”#ff0000”:设置每项的分割条
android:dividerHeight=”2dp”:设置分割条的高度
其添加setOnItemClickListener(OnItemClickListener)事件
setOnItemLongClickListener(OnItemLongClickListener)事件
总结:使用数组创建ListView十分简单。
但这种方式能定制的内容很少,数据不灵活。 甚至连每个列表项的字号大小,颜色都不能改变。如果想对ListView的外观,行为进行定制,需要把ListView作为AdapterView使用,通过Adapter控制每项的外观和行为。
2)Adapter是一个接口,为列表提供数据和格式
常见了Adapter有:
ArrayAdapter:简单,易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单,功能强大的Adapter,可以用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter相似,只是用于包装Cursor提供的数据
BaseAdapter:通常用于被扩展,可以对各列表项进行最大限度的定制
3)在布局文件中配置ListView使用ArrayAdapter为其添加显示数据、配置不同布局方式。
下面的布局都是Android系统自带的:android.R.layout
simple_list_item_1:每项显示一个内容时
simple_list_item_single_choice:带有单选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_SINGLE);
simple_list_item_multiple_choice:带有多选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
simple_list_item_checked:带有选择框的布局形式
也需要结合ListView中的setChoiceMode
总结:这种方式能够指定灵活的数据,但是界面比较单一,
每个列表项都是TextView组件。
也可以自定义布局文件,并且提供一个TextView组件.
4)SimpleAdapter,在布局文件中配置ListView
使用SimpleAdapter为其添加显示数据、实现自定义布局
SimpleAdapter(Context context, List<?extends Map<String, ?>> data, int resource, String[] from, int[] to)
第一个参数是Context,android上下文
第二个参数是List<? extends Map<String,?>>
类型的集合对象,
该集合中每个Map<String,?>
对象生成一个列表项
第三个参数是指定一个界面布局的ID。使用该界面作为列表项组件
第四个参数是一个String[]类型的参数,该参数决定提取Map<String,?>
对象中哪些key对应的value来生成列表项
第五个参数是一个int[]类型的参数,该参数决定填充哪些组件
总结:功能强大,可以实现更复杂的列表项。数据复杂。
但是只能显示本地图片,不能在线更新数据(如多个文件的下载进度)。
5)自定义Adapter适配器:extends BaseAdapter
BaseAdapter是所有适配器的基类
根据项目的情况提供自己需要的构造器
public MyAdapter(Context context,List<Map<String,Object>> list){}
//返回ListView中要显示的子View数量
//只需要返回构造方法中的list的条目就可以了
@Overridepublic int getCount() { return this.list!=null?this.list.size():0;}
//返回一个子View,即ListView中的一个子条目显示数据的对象。
//也可以自定义返回你想要的信息
public Object getItem(int position) { return this.list.get(position);}
//根据ListView中的位置返回适配器的位置。
public long getItemId(int position) { return position;}
//返回这个条目的整个信息
public View getView(int position, View convertView, ViewGroup parent) return convertView;}
6)ListView的实现另外一种方式:继承ListActivity
a)ListActivity默认布局中具有ListView,就可以不用指定布局文件。
然后调用setListAdapter为其指定适配器
也可以自定义布局方式,需要手动在布局文件中添加id为@android:id/list的ListView控件
b)然后调用setListAdapter为其指定适配器
android.R.layout.simple_list_item_2:显示两个文本框的布局
当ListView中的数据为空时,显示其他的组件,如下例:
指定该组件的id号为@android:id/empty
<TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No items."/>
第一种:ArrayAdapter
package com.xspacing.listview;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.listview); final String array[] = { "遮天", "斗破苍穹", "完美世界", "大主宰" }; listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array)); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), "点击" + array[position], 0).show(); } }); listView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), "长按了" + array[position], 0).show(); return true; // false长按不会消耗本次事件,会接着触发点击事件 } }); }}
<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" tools:context="com.xspacing.listview.MainActivity" > <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
第二种:SimpleAdapter
package com.xspacing.listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter;public class MainActivity extends Activity { private int[] mImageIds; private String[] mNames; private String[] mDescs; private Map<String, Object> map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.listview); mImageIds = new int[] { R.drawable.a36, R.drawable.a37, R.drawable.a38, R.drawable.a39, R.drawable.a40 }; mNames = new String[] { "张三", "李四", "王五", "老李", "老王" }; mDescs = new String[] { "哈哈", "嘿嘿", "嘻嘻", "嘎嘎", "叽叽" }; SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, getDatas(), R.layout.item_list_view, new String[] { "mImageIds", "mNames", "mDescs" }, new int[] { R.id.main_img, R.id.main_tv_name, R.id.main_tv_desc }); listView.setAdapter(mSimpleAdapter); } public List<Map<String, Object>> getDatas() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < mNames.length; i++) { map = new HashMap<String, Object>(); map.put("mImageIds", mImageIds[i]); map.put("mNames", mNames[i]); map.put("mDescs", mDescs[i]); list.add(map); } return list; }}
布局文件同上
第三种:BaseAdapter
package com.xspacing.slidelistview;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ListView;public class MainActivity extends Activity { private Context mContext; private ListView mListView; private MyBaseAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.main_list_view); mContext = this; final List<Student> list = new ArrayList<Student>(); // 添加假数据 for (int i = 0; i < 20; i++) { Student student = new Student(); if (i % 2 == 0) { student.name = i + ".阳澄湖大闸蟹"; student.desc = "9月23日正式开湖"; student.reId = R.drawable.a25; } else { student.name = i + ".特大新闻"; student.desc = "上海将举行xxx的演唱会"; student.reId = R.drawable.a26; } list.add(student); } adapter = new MyBaseAdapter(list, mContext); mListView.setAdapter(adapter); mListView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { list.remove(position); adapter.notifyDataSetChanged(); return true; } }); mListView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); }}
package com.xspacing.slidelistview;public class Student { public String name; //标题 public int reId; //图片 public String desc;//描述 public Student(String name, String desc,int reId) { this.name = name; this.desc = desc; this.reId=reId; } public Student() { }}
package com.xspacing.slidelistview;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.ImageView;import android.widget.ListAdapter;import android.widget.TextView;public class MyBaseAdapter extends BaseAdapter implements ListAdapter { List<Student> list; Context mContext; public MyBaseAdapter(List<Student> list, Context mContext) { this.list = list; this.mContext = mContext; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; // 是否复用 if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_view, parent, false); holder = new ViewHolder(); holder.mImageView = (ImageView) convertView.findViewById(R.id.main_img); holder.mTextVieName = (TextView) convertView.findViewById(R.id.main_tv_name); holder.mTextDesc = (TextView) convertView.findViewById(R.id.main_tv_desc); // 设置tag convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.mImageView.setImageResource(list.get(position).reId); holder.mTextVieName.setText(list.get(position).name); holder.mTextDesc.setText(list.get(position).desc); return convertView; } class ViewHolder { ImageView mImageView; TextView mTextVieName; TextView mTextDesc; }}
<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" tools:context="com.xspacing.slidelistview.MainActivity" > <ListView android:id="@+id/main_list_view" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView></RelativeLayout>
<?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="80dp" android:layout_margin="10dp" android:gravity="center_vertical"> <ImageView android:id="@+id/main_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" android:padding="5dp" > <TextView android:id="@+id/main_tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="第一个textview" android:textSize="17sp" android:textStyle="bold" /> <TextView android:id="@+id/main_tv_desc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:text="第二个textview" /> </LinearLayout></LinearLayout>
- ListView以及Adapter的用法
- ListView和Adapter的用法
- listView与adapter的用法
- Android开发系列(十四):ListView用法、对ListView监听的三种方法以及ListView中Adapter的使用方法
- Android的控件CheckBox、ImageView以及ListView的自定义Adapter用法
- ListView用法详解和Adapter的使用
- Android—ListView和Adapter的用法
- ListView及其优化和Adapter的用法
- listView和adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- listview与adapter用法
- java学习笔记之static,final,abstract修饰符和接口
- 实现使用正则表达式来判断指定的字符串是否是合法的E-mail地址
- MATLAB画图中文乱码使用代码解决
- Window_Open
- MODIS数据所有产品介绍与下载地址
- ListView以及Adapter的用法
- 电脑卡的打字都卡。怎么回事。有什么办法解决吗?
- hdu5881 Tea(XJB)
- android PendingIntent参数详细解析
- spring-boot使用logback的坑2
- beta 和 correlation 的关系
- session和cookie的区别
- Java学习笔记之Swing(二)
- linux命令之script