我的Android开发之路——ListView的使用
在Android开发过程中,遇到需要列表显示的时候,这时候就会用到listview。
1.首先创建一个ListViewTest项目,选择empty activity类型。修改activity_main.xml的布局文件,添加listview控件,设置宽高和id等属性
<?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 android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
此时通过预览就可以看见listview的布局情况,接下来我们要添加每一个item的布局,添加lv_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/iv_icon" android:layout_width="100dp" android:layout_height="100dp" android:gravity="center" /> <TextView android:id="@+id/lv_name" android:layout_width="match_parent" android:layout_height="100dp" android:text="icon" android:gravity="center" android:textSize="40sp" android:textColor="#1296db"/> </LinearLayout>
这里使用每行一个图标 一个名称作为item的内容(对应imageview 和textview)
2.适配器的编写
这里编写的适配器IconAdapter继承自BaseAdapter(ArrayAdapter及SimpleAdapter使用度不高)
继承BaseAdapter抽象类后,要实现父类中的getCount()、getItem()、getItemId()、getView()四个方法。
系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。每绘制一个Item就会调用一次getView方法,在getView中引用事先定义好的layout布局确定显示的效果并返回一个View对象作为一个Item显示出来。
这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了这两个方法,ListView就能完全按开发者的要求显示。而getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。
创建IconAdapter.java
①首先需要一个映射的list,这个list中包含了实体bean,具体就对应了每一个item的内容。用bean封装了每一个item的所需要的属性。
添加IconBean.java
public class IconBean { public String IconName; public int Icon_Image_Id; public String getIconName() { return IconName; } public void setIconName(String iconName) { IconName = iconName; } public int getIcon_Image_Id() { return Icon_Image_Id; } public void setIcon_Image_Id(int icon_Image_Id) { Icon_Image_Id = icon_Image_Id; } public IconBean(String s,int image_id){ IconName=s; Icon_Image_Id=image_id; } }
在adapter中添加装有IconBean的list,此时adapter的代码如下:
class IconAdapter extends BaseAdapter { public List<IconBean> mList;
public Context mContext;
public LayoutInflater mLayoutInflater;
@Override public int getCount() { return 0; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } }
②在Adapter中添加构造方法,参数传入Context及刚才的List对象
在之后解析布局的时候,还需要使用到layoutinflater,所以在构造方法中对它进行初始化。
public IconAdapter(Context context,List<IconBean> list){ mContext=context; mList=list; mLayoutInflater=LayoutInflater.from(context); }
③修改getcount()、getItem、getItemId()三个方法
@Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; }
④修改getView()方法,也是最主要的方法,这里使用ViewHolder写法。
创建ViewHolder静态类,并完成getView()方法。
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView==null){ viewHolder=new ViewHolder(); convertView=mLayoutInflater.inflate(R.layout.lv_item,null); viewHolder.mImageView=(ImageView) convertView.findViewById(R.id.iv_icon); viewHolder.mTextView=(TextView) convertView.findViewById(R.id.lv_name); convertView.setTag(viewHolder); }else { viewHolder= (ViewHolder) convertView.getTag(); } //从list取出对象 IconBean bean=mList.get(position); //设置item的内容 viewHolder.mImageView.setImageResource(bean.getIcon_Image_Id()); viewHolder.mTextView.setText(bean.getIconName()); return convertView; } private static class ViewHolder{ public ImageView mImageView; public TextView mTextView; }
此时完成适配器的编写。
3.在主线程中完成listview的使用
①添加listview和对应含有IconBean的映射list并完成初始化。
private List<IconBean> mIconBeenList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIconBeenList=new ArrayList<>(); ListView iconList= (ListView) findViewById(R.id.lv); }
②添加测试用的数据
private void initData() { IconBean Add=new IconBean("Add",R.drawable.add); mIconBeenList.add(Add); IconBean Close=new IconBean("Close",R.drawable.close); mIconBeenList.add(Close); IconBean Enter=new IconBean("Enter",R.drawable.enter); mIconBeenList.add(Enter); IconBean FullScreen=new IconBean("FullScreen",R.drawable.fullscreen); mIconBeenList.add(FullScreen); IconBean Right=new IconBean("Right",R.drawable.right); mIconBeenList.add(Right); mIconBeenList.add(Right); mIconBeenList.add(FullScreen); mIconBeenList.add(Enter); mIconBeenList.add(Close); mIconBeenList.add(Add); }
③为listview添加adapter
iconList.setAdapter(new IconAdapter(this,mIconBeenList));
此时完成例子的编写,MainActivity.java代码为
public class MainActivity extends AppCompatActivity { private List<IconBean> mIconBeenList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIconBeenList=new ArrayList<>(); ListView iconList= (ListView) findViewById(R.id.lv); initData(); iconList.setAdapter(new IconAdapter(this,mIconBeenList)); } private void initData() { IconBean Add=new IconBean("Add",R.drawable.add); mIconBeenList.add(Add); IconBean Close=new IconBean("Close",R.drawable.close); mIconBeenList.add(Close); IconBean Enter=new IconBean("Enter",R.drawable.enter); mIconBeenList.add(Enter); IconBean FullScreen=new IconBean("FullScreen",R.drawable.fullscreen); mIconBeenList.add(FullScreen); IconBean Right=new IconBean("Right",R.drawable.right); mIconBeenList.add(Right); mIconBeenList.add(Right); mIconBeenList.add(FullScreen); mIconBeenList.add(Enter); mIconBeenList.add(Close); mIconBeenList.add(Add); } }
大功告成,在模拟器上运行一下
项目地址:https://github.com/Lock0nStratos/ListViewTest