Android widget之ListView
简介
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);
效果图如下:
常用方法
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);
效果图:
拓展
我改变一下主界面布局,并且利用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);
}
}
}
});
}
}
效果图:
惊喜吗?这么高大上的效果,就这样实现了!
知识贵在分享!
下一篇: UGUI中实现多边形网格显示图形
推荐阅读
-
android中最低级错误之——editText.getText().toString()的值为空
-
Android动画之xml实现属性动画
-
android自定义toast(widget开发)示例
-
android实现widget时钟示例分享
-
Android Studio如何获取SQLite数据并显示到ListView上
-
Android Adapter里面嵌套ListView实例详解
-
Android使用ListView实现滚轮的动画效果实例
-
Android 实现ListView的点击变色的实例
-
Android远程桌面助手之文件管理器
-
Android中判断listview是否滑动到顶部和底部的实现方法