ListView
特点:
1、属于ViewGroup,里面可以放子组件
2、用于展示垂直滚动列表
3、列表有多个条目,条目的数据来自于 ListAdapter 适配器,而适配器的数据来自于比如数组或数据库等等
二、适配器
ListAdapter接口
BaseAdapter 抽象类
ArrayAdapter 实现类
SimpleAdapter实现类
ArrayAdapter : 当条目布局比较简单,里面就是一个textview。总的数据就是一个数组
SimpleAdapter: 当listview条目数据是一个map,总的数据 是 一个list<Map<>>
BaseAdapter:当条目布局比较复杂,里面有图片文本按钮等等,这个时候我们往往自定义类继承BaseAdapter (用的最多)
下面是使用各个适配器的详细介绍
一般都分为三部走,1.寻找布局控件2.设置数据3.使用合适的适配器——————最后也可以加上监听器
1.ArrayAdapeter
.xml
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.得到控件对象
lv = (ListView) findViewById(R.id.lv);
// 2.设置数据
initData();
// 3.找适配器
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, list));
// simple_expandable_list_item_1是android自带的布局了,你也可以自己定义
}
private void initData() {
list = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
list.add("haha" + i);
}
}
}
2.SimpleAdapter
Activity_main.xml
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
再创建一个item_activity_simple.xml用于布局你存储的信息的格式
item_activity_simple.xml
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="38dp"
android:text="1"
/>
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="56dp"
android:layout_toRightOf="@+id/name"
android:text="2"
android:textSize="38dp" />
.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.得到布局控件
lv = (ListView) findViewById(R.id.lv);
//2.设置数据
List<Map<String, Object>> data = initData();
//3.适配器
/**
* SimpleAdapter(context, data, resource, from, to)
* context联系上下文对象 data数据 resource 布局 from 列名的数组 比如姓名,年龄。
* to 条目布局中所有TextView id 的数组
*/
lv.setAdapter(new SimpleAdapter(this, data,R.layout.item_activity_simple,
new String[]{"name","age"}, new int[]{R.id.name,R.id.age}));
}
private List<Map<String, Object>> initData() {
// TODO Auto-generated method stub
List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
Map<String , Object> map=new HashMap<String, Object>();
map.put("name", "tom");
map.put("age", "11");
Map<String , Object> map2=new HashMap<String, Object>();
map2.put("name", "tony");
map2.put("age", "12");
Map<String , Object> map3=new HashMap<String, Object>();
map3.put("name", "sandy");
map3.put("age", "21");
data.add(map);
data.add(map2);
data.add(map3);
return data;
}
}
3.BaseAdapter 抽象类 (最常用也是最麻烦的)
Activity_main.xml
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
再建一个activity_food_dealites.xml用来布局格式
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<TextView
android:id="@+id/lv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lv_price"
android:layout_below="@+id/lv_price"
android:text="name"
android:textSize="30dp" />
<ImageView
android:id="@+id/lv_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="16dp"
android:layout_marginTop="20dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/lv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="price"
android:textSize="30dp" />
MainActivity.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
private List<Food> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.获取布局控件
lv = (ListView) findViewById(R.id.lv);
//2.设置数据
initData();
//3、适配器
lv.setAdapter(new FoodAdapter(list,this));
//4.设置监听器
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "你点击了:"+arg2, 0).show();
}
});
}
private void initData() {
list = new ArrayList<Food>();
int count=0;
for (int i = R.drawable.f1; i < R.drawable.f9; i++) {
//这里的我的图片是按f1-f9所以能用for循环,如果你的图片不是没有顺序,就老老实实的写吧。哈哈
Food food=new Food(i,"菜"+count,count+100,"土鳖吃的起码");
list.add(food);
count++;
}
}
}
再建一个FoodAdapter.java这是一个你自定义的Adapter适配器
public class FoodAdapter extends BaseAdapter {
//继承BaseAdapter时候。必须连接上下文
private List<Food> list;
private Context context;
public FoodAdapter(List<Food> list,Context context) {
// TODO Auto-generated constructor stub
this.list=list;
this.context=context;
}
/**
* 条目的总个数。。必须重写
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
/**
* 每个条目的数据对象 相当于本程序的Food对象
* arg0 条目的索引
*/
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
/**
* 每个条目的索引从0开始
*/
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
/**
* 设置并返回每个条目的布局,这个布局中设置好数据内容。。。。。必须重写
* arg0 条目的索引
* arg1 可以复用的条目的对象
* arg2 父元素
*/
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
//1.将条目布局中转换成View对象
View view=View.inflate(context, R.layout.activity_food_dealites, null);
//2.找到条目布局的各个控件,方便下一步设置数据
ImageView lv_img = (ImageView) view.findViewById(R.id.lv_img);
TextView lv_name = (TextView) view.findViewById(R.id.lv_name);
TextView lv_price = (TextView) view.findViewById(R.id.lv_price);
//3.为每个条目设置对应的数据(数据来自于list中每一对象的属性)
lv_img.setImageResource(list.get(arg0).getImageid());
lv_name.setText(list.get(arg0).getName());
lv_price.setText(list.get(arg0).getPrice()+"");
return view;
}