3.5.1 ListView 的简略用法

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    # 退出一个占满屏幕的 ListView    <ListView        android:id="@+id/list_view"        android:layout_width="match_parent"        android:layout_height="match_parent" >    </ListView></LinearLayout>
public class MainActivity extends AppCompatActivity {    private String[] data = {"Apple", "Banana", ...};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                // 构建适配器,simple_list_item_1 是安卓内置的布局文件        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);        ListView listView = (ListView) findViewById(R.id.list_view);        listView.setAdapter(adapter);    }

3.5.2 定制 ListView 的界面

# app/src/main/java/com/example/listviewtest/Fruit.javapublic class Fruit {    private String name;    private int imageId;    public Fruit(String name, int imageId) {        this.name = name;        this.imageId = imageId;    }    public String getName() {        return name;    }    public int getImageId() {        return imageId;    }}
# app/src/main/res/layout/fruit_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    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" />    <TextView        android:id="@+id/fruit_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"   # 垂直居中        android:layout_marginLeft="10dp" /></LinearLayout>

创立自定义的适配器,继承于 ArrayAdapter

# app/src/main/java/com/example/listviewtest/FruitAdapter.javapublic 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) {        // 获取以后项的Fruit实例        Fruit fruit = getItem(position);        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);        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 class MainActivity extends AppCompatActivity {    private List<Fruit> fruitList = new ArrayList<Fruit>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initFruits(); // 初始化水果数据        FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);        ListView listView = (ListView) findViewById(R.id.list_view);        listView.setAdapter(adapter);    }    private void initFruits() {        for (int i = 0; i < 2; i++) {            Fruit apple = new Fruit("Apple", R.drawable.apple_pic);            fruitList.add(apple);            Fruit banana = new Fruit("Banana", R.drawable.banana_pic);            fruitList.add(banana);            Fruit orange = new Fruit("Orange", R.drawable.orange_pic);            fruitList.add(orange);            Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);            fruitList.add(watermelon);            Fruit pear = new Fruit("Pear", R.drawable.pear_pic);            fruitList.add(pear);            Fruit grape = new Fruit("Grape", R.drawable.grape_pic);            fruitList.add(grape);            Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);            fruitList.add(pineapple);            Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);            fruitList.add(strawberry);            Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);            fruitList.add(cherry);            Fruit mango = new Fruit("Mango", R.drawable.mango_pic);            fruitList.add(mango);        }    }}

3.5.3 晋升 ListView 的运行效率

public class FruitAdapter extends ArrayAdapter<Fruit> {    ...        @Override    public View getView(int position, View convertView, ViewGroup parent) {        Fruit fruit = getItem(position); // 获取以后项的Fruit实例        View view;        ViewHolder viewHolder;        // convertView 用于将之前加载好的布局进行缓存        if (convertView == null) {            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);            viewHolder = new ViewHolder();            viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);            viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);            // 将ViewHolder存储在View中            view.setTag(viewHolder);        } else {            view = convertView;            // 从新获取ViewHolder            viewHolder = (ViewHolder) view.getTag();        }        viewHolder.fruitImage.setImageResource(fruit.getImageId());        viewHolder.fruitName.setText(fruit.getName());        return view;    }    // 外部类,用于对控件的实例进行缓存    class ViewHolder {        ImageView fruitImage;        TextView fruitName;    }}

3.5.4 ListView 的点击事件

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 初始化水果数据        initFruits();        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 AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                Fruit fruit = fruitList.get(position);                Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();            }        });    }