简介

ListView是一个视图组,显示可滚动项目的列表。并将每个项目结果转换为放置到列表中的视图。一般,自定义列表需要与(android.widget.BaseAdapter)配合使用!

属性

xml属性 相关方法 作用效果
android:divider setDivider(Drawable) 可在列表项之间绘制颜色
android:dividerHeight 在列表项之间绘制颜色的高度
android:entries 引用将填充ListView的数组资源
android:footerDividersEnabled 当设置为false时,ListView将不会在每个页脚视图之前画出分隔符
android:headerDividersEnabled 当设置为false时,ListView将不会在每个头部视图之后绘制分隔符

简单使用

可以配合(android.widget.ArrayAdapter)进行简单的数据列表显示(构造方法与参数详情):
  • ArrayAdapter (Context context, int resource)
    context(当前上下文)
    resource(一个布局文件的资源ID,其中包含一个在实例化视图时使用的TextView)

  • ArrayAdapter (Context context, int resource, int textViewResourceId)
    context(当前上下文)
    resource(布局文件的资源ID,其中包含在实例化视图时使用的布局)
    textViewResourceId(要填充的布局资源中的TextView的id)

  • ArrayAdapter (Context context, int resource, T[] objects)
    context(当前上下文)
    resource(布局文件的资源ID,其中包含在实例化视图时使用的布局)
    objects(在ListView中表示的对象,即 数据源)

  • ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
    context(当前上下文)
    resource(布局文件的资源ID,其中包含在实例化视图时使用的布局)
    textViewResourceId(要填充的布局资源中的TextView的id)
    objects(在ListView中表示的对象,即 数据源)

  • ArrayAdapter (Context context, int resource, List objects)
    context(当前上下文)
    resource(布局文件的资源ID,其中包含在实例化视图时使用的布局)
    objects(在ListView中表示的对象,即 数据源)

  • ArrayAdapter (Context context, int resource, int textViewResourceId, List objects)
    context(当前上下文)
    resource(布局文件的资源ID,其中包含在实例化视图时使用的布局)
    textViewResourceId(要填充的布局资源中的TextView的id)
    objects(在ListView中表示的对象,即 数据源)

举一个简单的例子:

xml布局:
<ListView    android:id="@+id/xListView"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:divider="@color/colorAccent"    android:dividerHeight="1dp">ListView>
适配数据源:
ListView listView = (ListView) findViewById(R.id.xListView);String[] data = new String[20];for (int i = 0; i < 20; i++) {    data[i] = "张-" + i;}ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);listView.setAdapter(adapter);
效果图如下:

Android widget之ListView_第1张图片

常用方法

  • setAdapter(ListAdapter adapter)
    匹配这个列表视图的数据

  • addFooterView(View v)或者addFooterView(View v, Object data, boolean isSelectable)
    在列表的底部添加一个固定的视图,可以多次添加

  • addHeaderView(View v)或者addHeaderView(View v, Object data, boolean isSelectable)
    在列表的顶部添加一个固定的视图,可一次添加,若第二次添加,则第二次添加的使徒不会显示在顶部,而是会排列在第一次添加的顶部布局下

  • smoothScrollToPosition(int position)
    滚动到指定的适配器位置

  • removeHeaderView(View v)
    删除先前添加的指定头部视图

  • removeFooterView(View v)
    删除之前添加的指定页脚视图

  • getFooterViewsCount()
    获取列表中页脚视图的数量

  • getHeaderViewsCount()
    获取列表中头视图的数量

  • setOnScrollListener( AbsListView.OnScrollListener l)
    这是一个继承至(android.widget.AbsListView)的方法,用它来监听视图滚动(每次列表滚动时都会收到通知的监听器)

  • setFriction(float friction)
    用于摩擦的摩擦量,即控制滚动条的速度

自定义适配器

自定义的xml布局:
<?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="wrap_content"    android:orientation="horizontal"    android:paddingBottom="16dp"    android:paddingTop="16dp">    <TextView        android:id="@+id/item_test_name"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="1"        android:gravity="center_vertical"        android:text="阿西吧" />    <TextView        android:id="@+id/item_test_phone"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="4"        android:gravity="center_vertical"        android:text="18756935824" />LinearLayout>
为此布局建立相对应的实体类:
/** * 简单解释一下Parcelable:相当与java的Serializable序列化 * Parcelable是Android中特有的接口来实现类的序列化操作. * 因此在绝大多数的情况下,Android还是推荐使用Parcelable来完成对类的序列化操作的. */public class ContactInfo implements Parcelable {    private String name;    private String phone;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(this.name);        dest.writeString(this.phone);    }    public ContactInfo() {    }    public ContactInfo(String name, String phone) {        this.name = name;        this.phone = phone;    }    protected ContactInfo(Parcel in) {        this.name = in.readString();        this.phone = in.readString();    }    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {        @Override        public ContactInfo createFromParcel(Parcel source) {            return new ContactInfo(source);        }        @Override        public ContactInfo[] newArray(int size) {            return new ContactInfo[size];        }    };}
建立相应的适配器:
public class TestAdapter extends BaseAdapter {    private Context context;    private List list;    public TestAdapter(Context context, List list) {        this.context = context;        this.list = list;    }    /**     * 返回数据源的 大小(长度)     */    @Override    public int getCount() {        //这是使用三目运算,防止 空指针 异常        return list == null ? 0 : list.size();    }    /**     * 返回当前 item 的数据     */    @Override    public Object getItem(int position) {        return list.get(position);    }    /**     * 返回当前 item 的Id     */    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        if (null == convertView) {            holder = new ViewHolder();            convertView = LayoutInflater.from(context).inflate(R.layout.item_test, parent, false);            holder.name = (TextView) convertView.findViewById(R.id.item_test_name);            holder.phone = (TextView) convertView.findViewById(R.id.item_test_phone);            convertView.setTag(holder);//setTag可以用来在视图中存储数据        } else {            holder = (ViewHolder) convertView.getTag();        }        ContactInfo info = list.get(position);        holder.name.setText(info.getName());        holder.phone.setText(info.getPhone());        return convertView;    }    /**     * 建立ViewHolder主要为了实现布局重用     */    class ViewHolder {        TextView name;        TextView phone;    }}
测试代码:
ListView listView = (ListView) findViewById(R.id.listView);List list = new ArrayList<>();list.add(new ContactInfo("张三", "18756935824"));list.add(new ContactInfo("李四", "18756935825"));list.add(new ContactInfo("王五", "18756935826"));list.add(new ContactInfo("校长", "18756935827"));list.add(new ContactInfo("是否", "18756935828"));list.add(new ContactInfo("返回", "18756935829"));list.add(new ContactInfo("水岸", "18756935820"));list.add(new ContactInfo("东方", "18756935814"));list.add(new ContactInfo("诸葛", "18756935834"));list.add(new ContactInfo("无极", "18756935844"));list.add(new ContactInfo("小时", "18756935854"));list.add(new ContactInfo("山东", "18756935864"));list.add(new ContactInfo("煎饼", "18756935874"));list.add(new ContactInfo("撒旦", "18756935884"));list.add(new ContactInfo("挖人", "18756935899"));list.add(new ContactInfo("非官", "18756935804"));list.add(new ContactInfo("萨达", "18756935234"));list.add(new ContactInfo("萨芬", "18756935324"));list.add(new ContactInfo("收费", "18756935424"));list.add(new ContactInfo("圣埃", "18756935524"));adapter = new TestAdapter(this, list);listView.setAdapter(adapter);
效果图:

Android widget之ListView_第2张图片

拓展

我改变一下主界面布局,并且利用addHeaderView(View v)与setOnScrollListener( AbsListView.OnScrollListener l) :

activity_main.xml   
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin">    <ListView        android:id="@+id/listView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:divider="#000"        android:dividerHeight="1dp"        android:scrollbars="none" />    <View        android:id="@+id/view"        android:layout_width="match_parent"        android:layout_height="80dp"        android:background="#8c4e4e"        android:visibility="gone" />RelativeLayout>

item_herder.xml
<?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="wrap_content"    android:orientation="vertical">    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingBottom="24dp"        android:paddingTop="24dp"        android:text="这是一个测试test" />LinearLayout>

item_suspend.xml
<?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="wrap_content"    android:orientation="vertical">    <View        android:layout_width="match_parent"        android:layout_height="80dp"        android:background="#8c4e4e" />LinearLayout>

MainActivity.java
public class MainActivity extends AppCompatActivity {    private ListView listView;    private List list;    private TestAdapter adapter;    private View view;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        view = findViewById(R.id.view);        listView = (ListView) findViewById(R.id.listView);        list = new ArrayList<>();        list.add(new ContactInfo("张三", "18756935824"));        list.add(new ContactInfo("李四", "18756935825"));        list.add(new ContactInfo("王五", "18756935826"));        list.add(new ContactInfo("校长", "18756935827"));        list.add(new ContactInfo("是否", "18756935828"));        list.add(new ContactInfo("返回", "18756935829"));        list.add(new ContactInfo("水岸", "18756935820"));        list.add(new ContactInfo("东方", "18756935814"));        list.add(new ContactInfo("诸葛", "18756935834"));        list.add(new ContactInfo("无极", "18756935844"));        list.add(new ContactInfo("小时", "18756935854"));        list.add(new ContactInfo("山东", "18756935864"));        list.add(new ContactInfo("煎饼", "18756935874"));        list.add(new ContactInfo("撒旦", "18756935884"));        list.add(new ContactInfo("挖人", "18756935899"));        list.add(new ContactInfo("非官", "18756935804"));        list.add(new ContactInfo("萨达", "18756935234"));        list.add(new ContactInfo("萨芬", "18756935324"));        list.add(new ContactInfo("收费", "18756935424"));        list.add(new ContactInfo("圣埃", "18756935524"));        adapter = new TestAdapter(this, list);        listView.setAdapter(adapter);        listView.addHeaderView(LayoutInflater.from(this).inflate(R.layout.item_herder, null));        listView.addHeaderView(LayoutInflater.from(this).inflate(R.layout.item_suspend, null));        listView.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                if (firstVisibleItem > 0) {                    if (!MainActivity.this.view.isShown()) {                        MainActivity.this.view.setVisibility(View.VISIBLE);                    }                } else {                    if (MainActivity.this.view.isShown()) {                        MainActivity.this.view.setVisibility(View.GONE);                    }                }            }        });    }}

效果图:


惊喜吗?这么高大上的效果,就这样实现了!


知识贵在分享!

更多相关文章

  1. Android 布局管理器 之 RelativeLayout&FrameLayout&AbsoluteLay
  2. Android自适应屏幕大小和layout布局
  3. Android之布局
  4. android在使用RecyclerView布局里的androidstudio的模拟器虚拟键
  5. Android布局——Linearlayout线性布局
  6. Android 布局深度优化(减少布局层次)

随机推荐

  1. 比较C#中值类型和引用类型的区别
  2. C#/.NET易错的几点
  3. Sql的执行过程说明
  4. 比较C#和JAVA中面向对象语法的区别
  5. 有关UML的基础介绍
  6. C#中匿名对象与var以及动态类型 dynamic
  7. 比较TCP与UDP之间的区别
  8. c# webservice中访问http和https的wsdl以
  9. C语言在屏幕上显示内容
  10. .NET Core2.0小技巧之MemoryCache问题修