- ListView在android程序中比较常用,在此做一下简单的总结
- 内容:自定义ListView, 自定义Adapter,ListView滚动事件的应用!
项目结构如下图
ListView的使用:
- 建立一个listView的布局文件,命名为:item_layout.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="match_parent" android:orientation="horizontal" android:paddingLeft="16dp" android:paddingTop="16dp"> <LinearLayout android:gravity="center_vertical" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="60dp"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Hello World" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="Button" /> </LinearLayout> </LinearLayout>
大致视图如下
- 创建一个自定义ListView的布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 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" tools:context="com.example.linux.listviewscrolltest.MainActivity"> <com.example.linux.listviewscrolltest.linux.CustomListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.example.linux.listviewscrolltest.linux.CustomListView> </LinearLayout>
- 建立一个Entity,命名为:PersonEntiry.java,用于显示
package com.example.linux.listviewscrolltest.linux; /** * Created by Linux on 2016/3/13. */ public class PersonEntiry { private int imageId; private String username; private String password; private String button; public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getButton() { return button; } public void setButton(String button) { this.button = button; } }
- 建立一个Holder,命名为:PersonViewHolder.java,对应于布局文件中的四个组件
package com.example.linux.listviewscrolltest.linux; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; /** * Created by Linux on 2016/3/13. */ public class PersonViewHolder { ImageView imageView; TextView textView1; TextView textView2; Button button; }
- 创建一个ListView的适配器,命名为PersonAdapter.java, 重写父类的四个方法:
package com.example.linux.listviewscrolltest.linux; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.example.linux.listviewscrolltest.R; import java.util.List; /** * Created by 胡红翔 on 2016/3/13. * function: 自定义ListView的适配器 * */ public class PersonAdapter extends BaseAdapter { List<PersonEntiry> personEntiries; LayoutInflater inflater; public PersonAdapter(Context context, List<PersonEntiry> personEntiries) { this.personEntiries = personEntiries; this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return personEntiries.size(); } @Override public Object getItem(int position) { return personEntiries.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { PersonEntiry entity = personEntiries.get(position); PersonViewHolder holder; if (convertView == null) { holder = new PersonViewHolder(); convertView = inflater.inflate(R.layout.item_layout, null); holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); holder.button = (Button) convertView.findViewById(R.id.button); convertView.setTag(holder); } else { holder = (PersonViewHolder) convertView.getTag(); } holder.imageView.setImageResource(entity.getImageId()); holder.textView1.setText(entity.getUsername()); holder.textView2.setText(entity.getPassword()); holder.button.setText(entity.getButton()); return convertView; } }
- 创建一个自定义的ListView:CustomListView,添加滚动事件:
package com.example.linux.listviewscrolltest.linux; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.widget.AbsListView; import android.widget.ListView; /** * Created by Linux on 2016/3/13. * function: 自定义的ListView */ public class CustomListView extends ListView implements AbsListView.OnScrollListener { private static final String TAG = "MainActivity"; public CustomListView(Context context) { super(context); setOnScrollListener(this); } public CustomListView(Context context, AttributeSet attrs) { super(context, attrs); setOnScrollListener(this); } public CustomListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOnScrollListener(this); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // view应该就是可见的View的集合 Log.i(TAG, "state change: " + scrollState + ", view size: " + view.getChildCount()); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.i(TAG, "on scroll: " + firstVisibleItem + ", visible: " + visibleItemCount + " , " + totalItemCount); } }
- 为测试方便,附上AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.linux.listviewscrolltest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
实现过程
ListView中比较重要的几个要素:
- 数据:
- 适配器adapter:
- listview:
然后,根据适配器的种类,我们可以把listview分成三种,有ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,而最后一种是专门与数据库连接用的。
说起数据适配器 :
顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。可以看作是 界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表, 数据库,集合等。 适配器就像显示器,把复杂的东西按人可以接受的方式来展现。 那么适配器是怎么处理得到的数据,并把它显示出来的呢。其实很简单,说白了适配器它也 是一个类,在类里面它实现了父类的这几个方法: publicint getCount() //得到数据的行数 public Object getItem(int position)//根据position得到某一行的记录 public long getItemId(int position)//的到某一条记录的ID //下面这个方法是最重要的相比于其它几个方法,它显式的定义了,适配器将要 以什么样的 //方式去显示我们所填充的数据,在自定义的适配器里面我们通常会给它写个布局文件 publicView getView(int position, View convertView, ViewGroup parent) 我们常用的适配器一共有三个:ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 这三个,他们都是继承于BaseAdapter 下面贴上一个自己简单封装的适配器代码:
public abstract class MyBaseAdapater<T> extends BaseAdapter { private List<T> list = new ArrayList<T>(); public MyBaseAdapater(List<T> list) { super(); this.list = list; } // 返回行数 @Override public int getCount() { return list.size(); } // 返回指定下标的实例 @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } // 返回 行视图 显示指定下标的数据 具体由子类去实现 @Override public abstract View getView(int position, View convertView, ViewGroup parent); }
</pre>