一、ListView的理解
ListView是用来显示可滑动列表的ViewGroup,其使用与其他的布局步骤不同,需要动态地添加显示的内容。使用ListView显示列表的步骤如下:
其中准备数据和数据适配器是学习ListView的重点。由于ListView中的每一个item是依次展示的,因此,数据的存放可以使用List集合或者数组。有了数据之后,需要将每一组数据添加到对应的item中,实现这一功能就需要数据适配器Adapter,ListView对象有一个方法可以用来设置Adapter:ListView.setAdapter(Adapter),下图展示了Adapter的作用:
二、Adapter
在学习ListView中,最难理解的是Adapter,Adapter是一个接口,其中最常用的实现类有三个:
通过Adapter实现ListView数据展示的步骤有三个:
下面分别介绍一下三种适配器的使用:
(1)ArrayAdapter
我们已知ArrayAdapter是抽象类BaseAdapter的一个子类,因此可以直接进行创建对象使用。通过源码发现,ArrayAdapter含有两种构造方法:
//构造方法1:使用T类型的数组数据
public ArrayAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull T[] objects) {
this(context, resource, 0, Arrays.asList(objects));
}
//构造方法2:使用T类型的集合数据
public ArrayAdapter(@NonNull Context context, @LayoutRes int resource,
@NonNull List<T> objects) {
this(context, resource, 0, objects);
}
通过源码可以发现,构造方法中有三个参数需要给出:
public class MainActivity extends AppCompatActivity {
private ListView lv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv1 = (ListView) findViewById(R.id.lv1);
//准备数据
String[] data = {"a","b","c","d","e","f","g","h","i","g","k","l"};
//准备数据适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_text,data);
//设置适配器显示列表
lv1.setAdapter(adapter);
}
}
(2)SimpleAdapter
同样的SimpleAdapter也是抽象类BaseAdapter的一个子类,也可以直接进行创建对象使用。通过源码发现,SimpleAdapter含有一种构造方法:
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
@LayoutRes int resource, String[] from, @IdRes int[] to) {
mData = data;
mResource = mDropDownResource = resource;
mFrom = from;
mTo = to;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
(3)BaseAdapter
与上述两种Adapter不同,BaseAdapter是一个抽象类,在使用时需要自己写出一个子类并实现其中的抽象方法。并且,BaseAdapter需要的数据类型是List < T >,需要自定义一个类对数据进行包装。使用步骤如下:
public class MainActivity_BaseAdapter extends AppCompatActivity {
private ListView lv_baseAdapter;
private List<Fruit> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main__base_adapter);
lv_baseAdapter = (ListView) findViewById(R.id.lv_baseAdapter);
//給出数据
data = new ArrayList<Fruit>();
data.add(new Fruit("苹果",R.drawable.apple_pic));
data.add(new Fruit("香蕉",R.drawable.banana_pic));
data.add(new Fruit("樱桃",R.drawable.cherry_pic));
data.add(new Fruit("葡萄",R.drawable.grape_pic));
data.add(new Fruit("芒果",R.drawable.mango_pic));
data.add(new Fruit("梨",R.drawable.pear_pic));
data.add(new Fruit("菠萝",R.drawable.pineapple_pic));
data.add(new Fruit("草莓",R.drawable.strawberry_pic));
data.add(new Fruit("西瓜",R.drawable.watermelon_pic));
data.add(new Fruit("苹果",R.drawable.apple_pic));
data.add(new Fruit("香蕉",R.drawable.banana_pic));
data.add(new Fruit("樱桃",R.drawable.cherry_pic));
data.add(new Fruit("葡萄",R.drawable.grape_pic));
data.add(new Fruit("芒果",R.drawable.mango_pic));
data.add(new Fruit("梨",R.drawable.pear_pic));
data.add(new Fruit("菠萝",R.drawable.pineapple_pic));
data.add(new Fruit("草莓",R.drawable.strawberry_pic));
data.add(new Fruit("西瓜",R.drawable.watermelon_pic));
//给出适配器
MyAdapter myAdapter = new MyAdapter();
//设置适配器
lv_baseAdapter.setAdapter(myAdapter);
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("wang", "getView: "+convertView);
Fruit fruit = data.get(position);
//加载布局(通过xml文件加载View要使用inflate方法)
if (convertView==null) convertView=View.inflate(MainActivity_BaseAdapter.this,R.layout.item_baseadapter,null);
//加载item中的组件,需要使用convertView.findViewById
ImageView iv_item = (ImageView) convertView.findViewById(R.id.iv_item);
TextView tv_item = (TextView) convertView.findViewById(R.id.tv_item);
iv_item.setImageResource(fruit.getImageID());
tv_item.setText(fruit.getName());
return convertView;
}
}
}