欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android widget之ListView

程序员文章站 2022-05-30 17:37:53
...

简介

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

常用方法

  • 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<ContactInfo> CREATOR = new Parcelable.Creator<ContactInfo>() {
        @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<ContactInfo> list;

    public TestAdapter(Context context, List<ContactInfo> 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<ContactInfo> 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

拓展

我改变一下主界面布局,并且利用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<ContactInfo> 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);
                    }
                }
            }
        });
    }
}

效果图:

Android widget之ListView


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


知识贵在分享!