Android 之 ListView的使用(一)
概述
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子。
一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非常简单。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便
主界面的布局
布局包含一个listview,宽高都是match_parent,撑满整个屏幕
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" 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.coderstory.listview.MainActivity"> <android.support.v7.widget.ListViewCompat android:layout_width="match_parent" android:id="@+id/myListView" android:layout_height="match_parent"> </android.support.v7.widget.ListViewCompat> </android.support.constraint.ConstraintLayout>
?List中item的布局
一个简单的布局:左边一个图片 ,右边一个文本.
<?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"> <ImageView android:id="@+id/myimage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/mytext" android:layout_width="wrap_content" android:layout_marginLeft="10dp" android:layout_gravity="center" android:layout_height="wrap_content" /> </LinearLayout>
item数据的实体类
用于保存每个item所需的数据
package com.coderstory.listview; /** * 实体类 用于保存每个item的使用的数据 * Created by cc on 2016/7/7. */ public class Entity { private String Name; //文本名称 private int imageID; //图片资源的ID Entity(String Name,int imageID){ this.Name=Name; this.imageID=imageID; } public String getName() { return Name; } public int getImageID() { return imageID; } }
自定义适配器
在这里接受构建listview的item所需的数据(通过构造函数),然后构造每一个item(getview方法)
package com.coderstory.listview; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by cc on 2016/7/7. */ public class myAdapter extends ArrayAdapter<Entity> { private int resourceID; public myAdapter(Context context, int resource, List<Entity> objects) { super(context, resource, objects); resourceID=resource; //保存xml的id } //解析每一条数据 实例化xml并初始化返回 @Override public View getView(int position, View convertView, ViewGroup parent) { Entity entity=getItem(position); View view; ViewHolder vh; if(convertView!=null){ //查询布局是否已经缓存 view=convertView; vh=(ViewHolder)view.getTag();//重新获取ViewHolder }else{ view= LayoutInflater.from(getContext()).inflate(resourceID,null); //读取items.xml文件并实例化 vh=new ViewHolder(); vh.myimage= (ImageView) view.findViewById(R.id.myimage);//查找items实例中的myimage vh.mytext= (TextView) view.findViewById(R.id.mytext);//查找items实例中的mytext view.setTag(vh); //保存到view中 } vh.myimage.setImageResource(entity.getImageID());//设置view中的图片 vh.mytext.setText(entity.getName());//设置view中的文字 return view;//返回这个自定义的view } //用于缓存控件的实例 class ViewHolder{ ImageView myimage; TextView mytext; } }
主界面初始化listview
在这里创建显示listview的数据集合,创建和设置适配器。
package com.coderstory.listview; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { // private String[] data={"A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D"}; private List<Entity> list=new ArrayList<>(); myAdapter adapter; @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.myListView); // listview.setAdapter(adapter); initEntity(); adapter=new myAdapter(MainActivity.this,R.layout.items,list); //创建适配器 ListView listview= (ListView) findViewById(R.id.myListView);//找到这个listview listview.setAdapter(adapter);//设置适配器 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Entity entity=list.get(position); Toast.makeText(MainActivity.this,entity.getName(),Toast.LENGTH_SHORT).show();//显示当前点击的item list.remove(entity);//从数据源删除这个item的数据 adapter.notifyDataSetChanged();//刷新listview } }); } //创建数据 private void initEntity() { Entity enity=new Entity("Name",R.mipmap.ic_launcher); list.add(enity); list.add(enity); list.add(enity); list.add(enity); list.add(enity); } }
预览