Android实战简易教程<五>(ListView用法研究)

来源:互联网 发布:统计模型的数据选择 编辑:程序博客网 时间:2024/06/12 05:56

Android用的最多的,也最难用的应该就是ListView了,下面我们研究一下它的用法。

一、最简单的ListView

我们简单介绍一下ListView的最简单用法,不用布局文件:

[java] view plaincopy
  1. package org.lxh.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.ArrayAdapter;  
  6. import android.widget.ListView;  
  7.   
  8. public class MainActivity extends Activity {  
  9.     private String[] arrays = { "Sunday""Monday""Tuesday""Wednesday",  
  10.             "Thursday""Friday""Saturday" };  
  11.     private ListView listView;  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         listView = new ListView(this);  
  17.         listView.setAdapter(new ArrayAdapter<String>(this,  
  18.                 android.R.layout.simple_expandable_list_item_1, arrays));//利用ArrayAdapter对数据进行包装  
  19.         super.setContentView(listView);//将ListView设置为显示界面  
  20.     }  
  21.   
  22. }  

运行实例如下:

二、结合ArrayAdapter实现较复杂的ListView

1.main.xml代码:

[html] view plaincopy
  1. <p><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" ></p><p>    <ListView  
  6.         android:id="@+id/list_view"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content" /></p><p></LinearLayout></p>  


2.fruit_item.xml代码:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.     <ImageView  
  7.         android:id="@+id/fruit_image"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content" />  
  10.   
  11.     <TextView  
  12.         android:id="@+id/fruit_name"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_gravity="center"  
  16.         android:layout_marginLeft="10sp" />  
  17. </LinearLayout>  

3.Fruit.java代码如下:

[java] view plaincopy
  1. package org.lxh.demo;  
  2.   
  3. public class Fruit {  
  4.     private String name;  
  5.     private int imageId;  
  6.   
  7.     public Fruit(String name, int imageId) {  
  8.         this.name = name;  
  9.         this.imageId = imageId;  
  10.     }  
  11.   
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.   
  16.     public int getImageId() {  
  17.         return imageId;  
  18.     }  
  19. }  


4.集成ArrayAdapter的FruitAdapter.java代码如下:

[java] view plaincopy
  1. package org.lxh.demo;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.ArrayAdapter;  
  10. import android.widget.ImageView;  
  11. import android.widget.TextView;  
  12.   
  13. public class FruitAdapter extends ArrayAdapter<Fruit> {  
  14.     private int resourceId;  
  15.   
  16.     public FruitAdapter(Context context, int textViewResourceId,  
  17.             List<Fruit> objects) {  
  18.         super(context, textViewResourceId, objects);  
  19.         resourceId = textViewResourceId;  
  20.     }  
  21.   
  22.     @Override  
  23.     public View getView(int position, View convertView, ViewGroup parent) {  
  24.         Fruit fruit = getItem(position);  
  25.         View view;  
  26.         ViewHolder viewHolder;  
  27.         if (convertView == null) {  
  28.             view = LayoutInflater.from(getContext()).inflate(resourceId, null);  
  29.             viewHolder = new ViewHolder();  
  30.             viewHolder.fruitImage = (ImageView) view  
  31.                     .findViewById(R.id.fruit_image);  
  32.             viewHolder.fruitName = (TextView) view  
  33.                     .findViewById(R.id.fruit_name);  
  34.             view.setTag(viewHolder);  
  35.         } else {  
  36.             view = convertView;  
  37.             viewHolder = (ViewHolder) view.getTag();  
  38.         }  
  39.   
  40.         viewHolder.fruitImage.setImageResource(fruit.getImageId());  
  41.         viewHolder.fruitName.setText(fruit.getName());  
  42.         return view;  
  43.   
  44.     }  
  45.   
  46.     class ViewHolder {  
  47.         ImageView fruitImage;  
  48.         TextView fruitName;  
  49.     }  
  50.   
  51. }  


5.MainActivity.java代码如下:

[java] view plaincopy
  1. package org.lxh.demo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.ListView;  
  9.   
  10. public class Hello extends Activity {  
  11.     private List<Fruit> fruitList = new ArrayList<Fruit>();  
  12.   
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState); // 生命周期方法  
  15.         super.setContentView(R.layout.main); // 设置要使用的布局管理器  
  16.         initFruits();  
  17.         FruitAdapter adapter = new FruitAdapter(Hello.this,  
  18.                 R.layout.fruit_item, fruitList);  
  19.         ListView listView = (ListView) findViewById(R.id.list_view);  
  20.         listView.setAdapter(adapter);  
  21.   
  22.     }  
  23.   
  24.     private void initFruits() {  
  25.         Fruit appleFruit = new Fruit("Apple", R.drawable.apple_pic);  
  26.         fruitList.add(appleFruit);  
  27.         Fruit bananaFruit = new Fruit("Banana", R.drawable.banana_pic);  
  28.         fruitList.add(bananaFruit);  
  29.         Fruit orangeFruit = new Fruit("Orange", R.drawable.orange_pic);  
  30.         fruitList.add(orangeFruit);  
  31.         Fruit waterFruit = new Fruit("Apple", R.drawable.watermelon_pic);  
  32.         fruitList.add(waterFruit);  
  33.   
  34.     }  
  35. }  


运行实例如下:



 三、结合上下文菜单实现单项的删除

修改MainActivity.java程序如下:

[java] view plaincopy
  1. package org.lxh.demo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.ContextMenu;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.view.View;  
  12. import android.view.ContextMenu.ContextMenuInfo;  
  13. import android.widget.ListView;  
  14. import android.widget.AdapterView.AdapterContextMenuInfo;  
  15.   
  16. public class Hello extends Activity {  
  17.     private List<Fruit> fruitList = new ArrayList<Fruit>();  
  18.     FruitAdapter adapter;  
  19.   
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState); // 生命周期方法  
  22.         super.setContentView(R.layout.main); // 设置要使用的布局管理器  
  23.         initFruits();  
  24.         adapter = new FruitAdapter(Hello.this, R.layout.fruit_item, fruitList);  
  25.         ListView listView = (ListView) findViewById(R.id.list_view);  
  26.         listView.setAdapter(adapter);  
  27.         super.registerForContextMenu(listView);//注册上下文菜单  
  28.   
  29.     }  
  30.   
  31.     @Override  
  32.     public void onCreateContextMenu(ContextMenu menu, View v,// 创建菜单项  
  33.             ContextMenuInfo menuInfo) {  
  34.   
  35.         super.onCreateContextMenu(menu, v, menuInfo);  
  36.         menu.setHeaderTitle("选择操作");  
  37.         menu.add(Menu.NONE, Menu.FIRST + 11"删除");  
  38.         menu.add(Menu.NONE, Menu.FIRST + 22"取消");  
  39.     }  
  40.   
  41.     @Override  
  42.     public boolean onContextItemSelected(MenuItem item) {// 选择监听  
  43.         AdapterContextMenuInfo acmiRef = (AdapterContextMenuInfo) item  
  44.                 .getMenuInfo();// 用来获取item信息哎,重要  
  45.         int removeIndex = acmiRef.position;  
  46.         switch (item.getItemId()) {  
  47.         case Menu.FIRST + 1:  
  48.             fruitList.remove(removeIndex);  
  49.             adapter.notifyDataSetChanged();// 删除后刷新ListView  
  50.   
  51.             break;  
  52.         case Menu.FIRST + 2:  
  53.   
  54.             break;  
  55.   
  56.         default:  
  57.             break;  
  58.         }  
  59.         return false;  
  60.     }  
  61.   
  62.     private void initFruits() {  
  63.         Fruit appleFruit = new Fruit("Apple", R.drawable.apple_pic);  
  64.         fruitList.add(appleFruit);  
  65.         Fruit bananaFruit = new Fruit("Banana", R.drawable.banana_pic);  
  66.         fruitList.add(bananaFruit);  
  67.         Fruit orangeFruit = new Fruit("Orange", R.drawable.orange_pic);  
  68.         fruitList.add(orangeFruit);  
  69.         Fruit waterFruit = new Fruit("Apple", R.drawable.watermelon_pic);  
  70.         fruitList.add(waterFruit);  
  71.   
  72.     }  
  73. }  


运行实例:

选择删除后:

总结

1.super.registerForContextMenu(listView);//注册上下文菜单

2.adapter.notifyDataSetChanged();// 删除后刷新ListView

3.AdapterContextMenuInfo acmiRef = (AdapterContextMenuInfo) item.getMenuInfo();// 用来获取当前item信息,重要

   int removeIndex = acmiRef.position;//获取点击位置的坐标


0 0