一:布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
二:创建数据源 并提供user对象
public class User {
private String name;
private int age;
private String sex;
private String address;
private String details;
private String phoneNumber;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
三:Activity使用ListView,初始化数据源,设置适配器
public class MainActivity extends AppCompatActivity {
ListView listView;
List<User> users;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new UserAdapter(users,MainActivity.this));
}
private void initData() {
users = new ArrayList<User>();
for (int i = 0; i < 20; i++) {
User user = new User();
user.setAddress("地址信息为" + i);
user.setAge(i);
user.setDetails("具体信息为" + i);
user.setName("姓名" + i);
user.setPhoneNumber("1234567890");
if (i % 2 == 0) {
user.setSex("男");
} else {
user.setSex("女");
}
users.add(user);
}
}
}
四:设置数据源,使用viewHolder来缓存数据
public class UserAdapter extends BaseAdapter {
List<User> users = new ArrayList<User>();
Context context;
LayoutInflater inflater;
public UserAdapter(List<User> users, Context context) {
this.users = users;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return users.size();
}
@Override
public Object getItem(int position) {
return users.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.age = (TextView) convertView.findViewById(R.id.age);
holder.sex = (TextView) convertView.findViewById(R.id.sex);
holder.address = (TextView) convertView.findViewById(R.id.address);
holder.details = (TextView) convertView.findViewById(R.id.details);
holder.phoneNumber = (TextView) convertView.findViewById(R.id.phoneNumber);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
User user = users.get(position);
holder.name.setText(user.getName());
holder.age.setText(user.getAge()+"");
holder.sex.setText(user.getSex());
holder.address.setText(user.getAddress());
holder.details.setText(user.getDetails());
holder.phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
class ViewHolder {
TextView name;
TextView age;
TextView sex;
TextView address;
TextView details;
TextView phoneNumber;
}
}
以上:是一个使用完整使用ListView的完整例子;
六:添加针对item的点击事件监听:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取控件数据源
TextView name = (TextView) view.findViewById(R.id.name);
Toast.makeText(MainActivity.this, name.getText().toString(), Toast.LENGTH_LONG).show();
//或者item的数据源
User user = users.get(position);
Toast.makeText(MainActivity.this, user.getName(), Toast.LENGTH_LONG).show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "longClick", Toast.LENGTH_LONG).show();
return false;
}
});
事件监听,都可以操作item数据,比如,可以获取item控件的单一值,也可以或者整个数据源的item的整体值
当设置长按与点击事件时,长按事件执行之后,也会响应点击事件,此刻,只需要把setOnItemLongClickListener()的事件监听,返回为true就可以了!
七:添加头部尾部View
LayoutInflaterinflater;
View headView;
View footVeiw;
addHeadView();
addFootView();
listView.addHeaderView(headView);
listView.setAdapter(new UserAdapter(users, MainActivity.this));
listView.addFooterView(footVeiw);
private void addHeadView() {
headView = inflater.inflate(R.layout.head_view, null);
TextView tvString = (TextView) headView.findViewById(R.id.tvString);
tvString.setText("addHeadView");
}
private void addFootView() {
footVeiw = inflater.inflate(R.layout.head_view, null);
TextView tvString = (TextView) footVeiw.findViewById(R.id.tvString);
tvString.setText("addFootView");
}
添加的View必须都为View,并且可以对View进行操作,控件响应事件,添加addHeaderView()需要放到设置适配器前面,添加addFooterView()需要放到设置适配器后面,当无法显示添加的头部view时,可以先listView.setAdapter(null);
八:listview多布局
1)重写 getViewTypeCount() – 该方法返回多少个不同的布局
2)重写 getItemViewType(int) – 根据position返回相应的Item
3)根据view item的类型,在getView中创建正确的convertView
final int type_1 = 0;
final int type_2 = 1;
final int type_3 = 2;
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
int p = position % 3;
if (p == 0) {
return 0;
} else if (p == 1) {
return 1;
} else {
return 2;
}
}
int type = getItemViewType(position);
if (convertView == null) {
switch (type) {
case type_1:
convertView = inflater.inflate(R.layout.listview_item, parent, false);
break;
case type_2:
convertView = inflater.inflate(R.layout.listview_item_one, parent, false);
break;
case type_3:
convertView = inflater.inflate(R.layout.listview_item_two, parent, false);
break;
}
根据返回的type,加载不同的布局文件形成多布局!
九:ListView不可滑动
public class NoScrollListView extends ListView {
public NoScrollListView(Context context) {
super(context);
}
public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
使用时,要想ListView滑动,则外面加一层ScrollView布局
10:监听ListView的滑动事件
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
Toast.makeText(MainActivity.this, "滑动结束", Toast.LENGTH_LONG).show();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
Toast.makeText(MainActivity.this, "滑动中", Toast.LENGTH_LONG).show();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
Toast.makeText(MainActivity.this, "完成一段滑动", Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Toast.makeText(MainActivity.this, "firstVisibleItem" + firstVisibleItem + " visibleItemCount" +
visibleItemCount + " totalItemCount" + totalItemCount, Toast.LENGTH_LONG).show();
}
});
监听Listview的滑动事件,注意:当你对listview添加Header或者FooterView的时候,totalItemCount的总数算自动加上所添加的条目,也就是说算一个Item!