1.先简单写一个运用ListView 的小程序,
因为ListView是用来展示大量数据的,作为入门,我们就先将数据提供好,所以使用String数组。
1)先在activity_main.xml文件中写这样的程序,
<LinearLayout 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=".MainActivity" >
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
2)编辑MainActivity.java程序
public class MainActivity extends Activity {
private String[] data={"Apple","Banana","Qrange","Watermelon","Pear","Grape","Pineaaple","Strawberry","Cherry","Mango"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,data);
//数组中的数据是无法直接传递给LIstView的,需要借助适配器来完成
//上面三个参数的意义分别是:当前上下文,ListView子项布局的id,要适配的数据。
//可用于简单的显示一段文本
ListView listView=(ListView)findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
}
这样一个初步的小程序就写完了,下面的例子是在这个例子的基础上改写的
2.定制LiatView界面
1)定义一个实体类,作为ListView适配器的适配类型
public class Fruit {
private String name;
private int imageId;
public Fruit(String name, int imageId) {
super();
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;//用来表示水果的名字
}
public int getImageId() {
return imageId;//水果对应的图片资源的id
}
}
2)为ListView的子项定义一个我们自定义的布局,在layout目录下,新建fruit_item.xml
<?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/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- imageView用于显示水果的图片 -->
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip"/>
<!-- TextView用于显示水果的名称 -->
</LinearLayout>
3)创建一个系定义的适配器,下面虽然是一个程序,小妞建议当成三个例子来练习,三个同样的方法,不过第一个方法没有进行任何的优化,后面两个方法分别进行了优化
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId,List<Fruit> objects) {
super(context, textViewResourceId,objects);
resourceId=textViewResourceId;
}
/*@Override
public View getView(int position, View convertView, ViewGroup parent) {
//这个方法在每个子项被滚动到屏幕内的时候都会被调用
// TODO Auto-generated method stub
Fruit fruit=getItem(position);//获取当前项的Fruit实例
View view=LayoutInflater.from(getContext()).inflate(resourceId, null);//为这个子项加载我们传入的布局
ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
TextView fruitName=(TextView)view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}*/
//每次都去加载布局,需要进行优化
/*@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Fruit fruit=getItem(position);
View view;
if (convertView==null) {
view=LayoutInflater.from(getContext()).inflate(resourceId, null);//加载布局
}else {
view=convertView;//如果不为空,直接对convertView进行重用
}
ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
TextView fruitName=(TextView)view.findViewById(R.id.fruit_name);//每次都去获取一次控件的实例
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}*/
每次都去获取一次控件的实例,继续进行优化
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Fruit fruit=getItem(position);
View view;
ViewHolder viewHolder;
if (convertView==null) {
view=LayoutInflater.from(getContext()).inflate(resourceId, null);//加载布局
viewHolder=new ViewHolder();
viewHolder.fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
viewHolder.fruitName=(TextView)view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}else {
view=convertView;//如果不为空,直接对convertView进行重用
viewHolder=(ViewHolder)view.getTag();//重新获取ViewHolder
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
}
4)修改MainActivity.java中的代码
public class MainActivity extends Activity {
private List<Fruit> fruitList=new ArrayList<Fruit>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();//这是自定义的方法,用来初始化Fruit,
FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
ListView listView=(ListView)findViewById(R.id.list_view);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {//这个是为每一次的点击设置监听器,这里使用了setOnClickListener为ListView注册了一个监听器
//每当用户点击屏幕中的任何一个子项时,都会掉哦那个onItemClick方法。通过Toast将获取到的水果的名字显示出来
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Fruit fruit=fruitList.get(position);
Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_LONG).show();
}
});
}
private void initFruits() {
Fruit apple=new Fruit("Apple", R.drawable.ic_launcher);
fruitList.add(apple);
Fruit banana=new Fruit("Banana", R.drawable.ic_launcher);
fruitList.add(banana);
Fruit orange=new Fruit("Orange", R.drawable.ic_launcher);
fruitList.add(orange);
Fruit watermelon=new Fruit("Watermelon", R.drawable.ic_launcher);
fruitList.add(watermelon);
Fruit pear=new Fruit("Pear", R.drawable.ic_launcher);
fruitList.add(pear);
Fruit grape=new Fruit("Grape", R.drawable.ic_launcher);
fruitList.add(grape);
Fruit pineapple=new Fruit("Pineapple", R.drawable.ic_launcher);
fruitList.add(pineapple);
Fruit starwberry=new Fruit("Strawberry", R.drawable.ic_launcher);
fruitList.add(starwberry);
Fruit cherry=new Fruit("Cherry", R.drawable.ic_launcher);
fruitList.add(cherry);
Fruit mango=new Fruit("Mango", R.drawable.ic_launcher);
fruitList.add(mango);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
小妞的这篇博客,大家还是边看边敲吧,光看不顶用呀,小妞专属(摘自安卓《第一行代码 Android》)