ListView
ListView是android常用组件,常用于显示一堆数据,类似web ui中的datatable。
ListView展示数据的步骤
- 定义item布局
- 定义数据源
- 将item布局和数据源放入适配器
- 将适配器与listview关联
最简单的listview
- item布局文件,这里我们使用android自带的布局文件,android.R.layout.simple_list_item_1
它里边只有一个textview
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
- 定义数据源,将item布局和数据源放入适配器,将适配器与listview关联
activity代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_layout);
ListView lv = (ListView) findViewById(R.id.lv1);
String[] fruits = {"apple","orange","beach","mango"};
ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fruits);
lv.setAdapter(adapter);
}
- 最后,主界面的布局文件
<ListView
android:id="@+id/lv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
></ListView>
效果图
自定义ListView
有时,我们需要自定义显示多列,列中有图片,说明之类的。自定义说到底就是改变item布局文件
item布局文件
<?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" >
<ImageView android:id="@+id/myface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView android:id="@+id/myname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
/>
</LinearLayout>
适配器
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int resource, List<Fruit> objects) {
super(context, resource, objects);
resourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
ImageView imageView= (ImageView) view.findViewById(R.id.myface);
TextView textView = (TextView) view.findViewById(R.id.myname);
imageView.setImageResource(fruit.getImageId());
textView .setText(fruit.getName());
return view;
}
}
public class Fruit {
private String name;
private int imageId;
}
getView方法介绍
getView: item滚入到屏幕中时,被调用
第一个参数:position,item在数据源中的位置
第二个参数:convertView,这个参数要重点理解,convertView是滚出屏幕的那个item的布局,在优化ListView时,常常会用这个变量。这样在滚入item时,使用滚出item的布局,然后把值覆盖掉。
优化后的代码
优点:不用每次都加载布局文件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
} else {
view = convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.myface);
imageView.setImageResource(fruit.getImageId());
TextView textView = (TextView) view.findViewById(R.id.myname);
textView.setText(fruit.getName());
return view;
}
效果