Android之ListView的使用(一)

来源:互联网 发布:网游推荐 知乎 编辑:程序博客网 时间:2024/05/22 06:42

         在Android开发中,ListView可以说是最常见的控件之一,几乎所有的应用程序都会用到它,ListView可以说是最常见的控件之一,由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候,就可以借助ListView来实现。

         先说一下ListView的简单用法:

创建一个ListViewTest项目,修改activity_main.xml中代码,如下:

 

<RelativeLayoutxmlns: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"/>

</RelativeLayout>

 

修改MainActivity代码,如下:

 

public class MainActivity extends Activity{

   private ListView listView;

 

   private String[] data ={"Apple","Banana","Orange","Watermelon"};

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       ArrayAdapter<String> adapter = newArrayAdapter<String>(this,

                android.R.layout.simple_list_item_1,data);

       listView = (ListView) findViewById(R.id.list_View);

       listView.setAdapter(adapter);

    }

}

 

运行截图:

每一个ListView都需要绑定一个Adapter(适配器),Android提供了很多适配器的实现类,ArrayAdapter比较好用,它可以通过范性来指定要适配的数据类型,然后在构造函数中把要适配的数据传入即可。

ArrayAdapter()构造函数参数依次:当前上下文、ListView的子项目布局id(上面用了一个系统自带的布局),要适配的数据。

最后需要使用setAdapter方法将ListView与数据关联起来。

 

接下来,定制ListView

       以上实现太过单一化,我们来对ListView的界面进行定制,让它可以显示更加丰富的内容。

         接着上面的工程,我现在创建一个类Fruit作为ListView适配器的适配类型,

   public 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 void setName(String name) {

       this.name = name;

    }

 

   public int getImageId() {

       return imageId;

    }

 

   public void setImageId(int imageId) {

       this.imageId = imageId;

    }

}

Fruit类中有两个属性,分别是name(水果名字),imageId(水果对应图像的Id).

 

然后我自定义一个子项布局,新建fruit_item.xml,如下

<?xml version="1.0"encoding="utf-8"?>

<LinearLayoutxmlns: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="10dp"/>

</LinearLayout>

 

这个布局包含一个图片(显示水果图片)和一个文本(显示水果名字)。

 

接下来我创建一个自定义的适配器FruitAdapter,代码如下:

public class FriutAdapter extends ArrayAdapter<Fruit>{

   private int resourceId;

   public FriutAdapter(Context context, int resource) {

       super(context, resource);

       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 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来为这个子项加载我们传入的布局,接着通过findViewById就能找到布局中相应的控件实例进行操作了。

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

public class MainActivity extends Activity{

   private ListView listView;

 

   private String[] data = {"Apple","Banana","Orange","Watermelon"};

   private List<Fruit> fruitList = new ArrayList<Fruit>();

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

//       ArrayAdapter<String> adapter = newArrayAdapter<String>(this,

//               android.R.layout.simple_list_item_1, data);

       FriutAdapter myAdapter = newFriutAdapter(this,R.layout.fruit_item,fruitList);

       getData();

       listView = (ListView) findViewById(R.id.list_View);

       listView.setAdapter(myAdapter);

    }

 

   private void getData() {

       Fruit apple = new Fruit("Apple",R.drawable.apple);

       fruitList.add(apple);

       Fruit banana = new Fruit("Banana",R.drawable.banana);

       fruitList.add(banana);

       Fruit orange = new Fruit("Orange",R.drawable.orange);

       fruitList.add(orange);

       Fruit watermelon = newFruit("Watermelon",R.drawable.watermelon);

       fruitList.add(watermelon);

    }

}

 

getData()函数将水果的数据初始化,然后创建自定义适配器与ListView绑定。

运行截图:

 

下一章,我将分析一下ListView的优化问题。

0 0
原创粉丝点击