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 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);
效果图:
拓展
我改变一下主界面布局,并且利用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); } } } }); }}
效果图:
惊喜吗?这么高大上的效果,就这样实现了!
知识贵在分享!
更多相关文章
- Android 布局管理器 之 RelativeLayout&FrameLayout&AbsoluteLay
- Android自适应屏幕大小和layout布局
- Android之布局
- android在使用RecyclerView布局里的androidstudio的模拟器虚拟键
- Android布局——Linearlayout线性布局
- Android 布局深度优化(减少布局层次)