zoukankan      html  css  js  c++  java
  • 最常用和最难用的控件--ListView(Android第一行代码)

      由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有

    大量的数据需要展示的时候,就可以借助 ListView 来实现。ListView 允许用户通过手指上下

    滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕

    1.ListView 的简单用法
    首先新建一个 ListViewTest 项目,并让 ADT 自动帮我们创建好活动。然后修改
    activity_main.xml 中的代码,如下所示:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ListView
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    </ListView>
    </LinearLayout>
    在布局中加入 ListView 控件还算非常简单,先为 ListView 指定了一个 id,然后将宽度
    和高度都设置为 match_parent,这样 ListView 也就占据了整个布局的空间。

    接下来修改 MainActivity 中的代码,如下所示:


    public class MainActivity extends Activity {
    private String[] data = { "Apple", "Banana", "Orange", "Watermelon",
    "Pear", "Grape", "Pineapple", "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 = (ListView) findViewById(R.id.list_view);
    listView.setAdapter(adapter);
    }
    }
    既然 ListView 是用于展示大量数据的,那我们就应该先将数据提供好。这些数据可以是
    从网上下载的,也可以是从数据库中读取的,应该视具体的应用程序场景来决定。这里我们
    就简单使用了一个 data 数组来测试,里面包含了很多水果的名称。
    不过,数组中的数据是无法直接传递给 ListView 的,我们还需要借助适配器来完成。
    Android 中提供了很多适配器的实现类,其中我认为最好用的就是 ArrayAdapter。它可以通
    过泛型来指定要适配的数据类型, 然后在构造函数中把要适配的数据传入即可。
    这里由于我们提供的数据

    都是字符串,因此将 ArrayAdapter 的泛型指定为 String,然后在 ArrayAdapter 的构造函数中
    依次传入当前上下文、ListView 子项布局的 id,以及要适配的数据。注意我们使用了
    android.R.layout.simple_list_item_1 作为 ListView 子项布局的 id,这是一个 Android 内置的布
    局文件,里面只有一个 TextView,可用于简单地显示一段文本。这样适配器对象就构建好了。
    最后,还需要调用 ListView 的 setAdapter()方法,将构建好的适配器对象传递进去,这
    样 ListView 和数据之间的关联就建立完成了。

     

    2.定制 ListView 的界面
    只能显示一段文本的 ListView 实在是太单调了,我们现在就来对 ListView 的界面进行
    定制,让它可以显示更加丰富的内容。
    首先需要准备好一组图片,分别对应上面提供的每一种水果,待会我们要让这些水果名
    称的旁边都有一个图样。
    接着定义一个实体类,作为 ListView 适配器的适配类型。新建类 Fruit,代码如下所示:
    public class Fruit {
    private String name;
    private int imageId;
    public Fruit(String name, int imageId) {
    this.name = name;
    this.imageId = imageId;
    }
    第 2 章 先从看得到的入手,探究活动
    131
    public String getName() {
    return name;
    }
    public int getImageId() {
    return imageId;
    }
    }
    Fruit 类中只有两个字段,name 表示水果的名字,imageId 表示水果对应图片的资源 id。
    然后需要为 ListView 的子项指定一个我们自定义的布局,在 layout 目录下新建
    fruit_item.xml,代码如下所示:
    <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" />
    <TextView
    android:id="@+id/fruit_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="10dip" />
    </LinearLayout>
    在这个布局中,我们定义了一个 ImageView 用于显示水果的图片,又定义了一个
    TextView 用于显示水果的名称。
    接下来需要创建一个自定义的适配器,这个适配器继承自 ArrayAdapter,并将泛型指定
    为 Fruit 类。新建类 FruitAdapter,代码如下所示:
    public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;
    第一行代码——Android
    132
    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 = 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;
    }
    }
    FruitAdapter 重写了父类的一组构造函数,用于将上下文、ListView 子项布局的 id 和数
    据都传递进来。另外又重写了 getView()方法,这个方法在每个子项被滚动到屏幕内的时候
    会被调用。在 getView 方法中,首先通过 getItem()方法得到当前项的 Fruit 实例,然后使用
    LayoutInflater 来为这个子项加载我们传入的布局, 接着调用 View 的 findViewById()方法分别
    获取到 ImageView 和 TextView 的实例,并分别调用它们的 setImageResource()和 setText()方
    法来设置显示的图片和文字,最后将布局返回,这样我们自定义的适配器就完成了。
    下面修改 MainActivity 中的代码,如下所示:
    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(); // 初始化水果数据
    FruitAdapter adapter = new FruitAdapter(MainActivity.this,
    R.layout.fruit_item, fruitList);
    ListView listView = (ListView) findViewById(R.id.list_view);
    第 2 章 先从看得到的入手,探究活动
    133
    listView.setAdapter(adapter);
    }
    private void initFruits() {
    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);
    }
    }
    可以看到,这里添加了一个 initFruits()方法,用于初始化所有的水果数据。在 Fruit 类的
    构造函数中将水果的名字和对应的图片 id 传入,然后把创建好的对象添加到水果列表中。
    接着我们在 onCreate()方法中创建了 FruitAdapter 对象,并将 FruitAdapter 作为适配器传递给
    了 ListView。这样定制 ListView 界面的任务就完成了。

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/new-comer/p/5347112.html
Copyright © 2011-2022 走看看