android ListView组件使用实在是太频繁了,因此特意制作了Android ListView的详细使用教程,还有和listview配套使用的BaseAdapter以及ArrayAdapter都会在文章后面有讲到,非常的实用。
为了便于理解下面listview的使用方法,我想先让你看下本人的android项目的目录结构是很有必要的,如图。
案例一:首先我们用ListView制作一个简单的联系人列表,没有头像,就只有一个名字,暂时只用了activity_main.xml这一个layout xml文件,请先不考虑其它几个文件。效果如图。
1:首先我们在activity_main.xml这个文件里面定义一个listview标签,用于显示表格数据,代码如下。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.baidu.listviewdemo.MainActivity"> <!--添加一个Listview标签--> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myListView"> </ListView> </RelativeLayout>
2:然后我们在对应的MainActivity.java文件里面写方法,给listview添加数据,代码如下,运行之后就是上面图片的效果。
package com.baidu.listviewdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity { private ListView listView; String[] phones = new String[] { "Android", "iOS", "WindowsMobile", "Blackberry","YunOS"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView)findViewById(R.id.myListView); ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,phones); listView.setAdapter(adapter); } }
提醒:simple_list_item_1这个是android系统提供的layout,它的相当于listview行对象,phones是一个存有数据的数组,ArrayAdapter会自动给每一行对象添加数据。
案例二:由于上面案例一的listview太过简单,有时候不符合我们的需求,因此我们需要自定义listview的row(行),效果如图。
1:我们将activity_main.xml里面的Listview标签给去除掉,因为我们要自定义新建一个叫list_view.xml的layout文件,新建方法为:选择layout文件夹->右键new->xml->layout xml file,新建之后我们在list_view.xml文件中自定义一个Listview的标签,宽高设置为屏幕大小(match_parent),代码如下。
<?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"> <!--自定义的listview--> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myListView"> </ListView> </LinearLayout>
2:我们再新建一个layout_item.xml的layout文件,里面自定义两个ImageView和TextView标签,用于在每一行显示头像和名字,代码如下。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="match_parent"> <!--显示头像--> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:maxWidth="30dp" android:maxHeight="30dp" android:layout_gravity="center_vertical" android:id="@+id/logo_image" /> <!--显示名称--> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:height="44dp" android:textSize="16dp" android:gravity="center_vertical" android:id="@+id/my_text"/> </LinearLayout>
3:自定义一个MyAdapter类,并继承ArrayAdapter类(BaseAdapter也是可以的),实现ArrayAdapter里面所有的方法,代码如下。
package com.baidu.listviewdemo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends ArrayAdapter { private Context context; private String[] phones; //Inflater意思为充气机,就是用于设置每行数据的对象 private LayoutInflater flater; public MyAdapter(Context context, int resource,String[] phones) { super(context,resource,phones); this.context = context; this.phones = phones; flater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return phones.length; } @Override public Object getItem(int position) { return phones[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null){ //通过flater获取lis行对象 convertView = flater.inflate(R.layout.layout_item,parent,false); } //设置头像数据 ImageView imageView = (ImageView)convertView.findViewById(R.id.logo_image); imageView.setImageResource(R.drawable.ic_account_circle); //设置名称数据 TextView textView = (TextView)convertView.findViewById(R.id.my_text); textView.setText(phones[position]); return convertView; } }
4:在MainActivity.java中加载我们的listView,这样就会显示我们的联系人列表数据了,代码如下。
package com.baidu.listviewdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity { private ListView listView; String[] phones = new String[] { "Android", "iOS", "WindowsMobile", "Blackberry","YunOS"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); //设置list_view.xml为程序主页面 setContentView(R.layout.list_view); //获取listview对象 listView = (ListView)findViewById(R.id.myListView); //自定义adapter MyAdapter adapter = new MyAdapter(this,R.layout.layout_item,phones); listView.setAdapter(adapter); //为每一行添加点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { System.out.println("你选择的手机是:"+phones[position]); } }); } }
提示:R.layout.layout_item也是行对象,里面包含了Imageview和TextView两个元素,所以需要作为参数传给ArrayAdapter对象。