ListView
属性方法介绍:
常用属性:
listSelector:listView每项在选中、按下等不同状态时的Drawable
divider :ListView每项间的间隔Drawable
dividerHeight :ListView每项间间隔的间隔高度
drawSelectorOnTop(AbsListView中的方法):默认值为false,如果为true则ListView中选中的列表项将会显示在上面
常用方法:
setAdapter() : 设置数据适配器
setOnItemClickListener():设置子条目点击事件
addHeaderView(): 添加头视图
addFooterView() :添加尾视图
setEmptyView() :设置数据项为0时的空数据视图
使用一:
- 1.布局中添加ListView控件,代码中初始化
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv_array"
android:divider="#ffaa00"
android:dividerHeight="2dp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_array);
ListView mLvArray = (ListView) findViewById(R.id.lv_array);
}
- 2.初始化适配器
String[] array = {"张三","张四","张五","张六","张七","张八","张九","李四","李五","王五","王六","王七","王八"};
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,array);
- 3.绑定适配器
mLvArray.setAdapter(arrayAdapter);
使用SimpleAdapter和ArrayAdapter类似,此处不做赘述。下面看看BaseAdapter的使用。
使用二:
1.布局中添加ListView控件,代码中初始化,与上面相同。
2.初始化适配器
BaseAdapter baseAdapter = new BaseAdapter() {
// 列表子项数量
@Override
public int getCount() {
return 50;
}
// 第position处的列表项内容
@Override
public Object getItem(int position) {
return null;
}
// 第position处的列表项id
@Override
public long getItemId(int position) {
return position;
}
// 第position处的列表项组件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 自定义布局
convertView = BaseActivity.this.getLayoutInflater().inflate(R.layout.lvi_simple, null);
// 获取自定义布局中的组件
ImageView ivLviTitle = convertView.findViewById(R.id.iv_lvi_simple_title);
TextView tvLviName = convertView.findViewById(R.id.tv_lvi_simple_name);
TextView tvLviDesc = convertView.findViewById(R.id.tv_lvi_simple_desc);
// 设置数据
ivLviTitle.setImageResource(R.drawable.xian);
tvLviName.setText("第 " + position + " 个列表项");
tvLviDesc.setText("第 " + position + " 个列表项 说明");
return convertView;
}
};
- 3.绑定适配器
mLvBase.setAdapter(baseAdapter);
适配器优化:
// 优化一:每次获取view时进行判断,convertView是否为空,是,则创建视图;否,则使用已经消失的视图(条目view);
// 然后设置数据。
// 优化二:使用静态内部类(ViewHolder)将视图中的控件保存起来,每次只需要从ViewHolder中获取就可以,
// 不再通过findViewById方法去获取。
BaseAdapter baseAdapter = new BaseAdapter() {
// 列表子项数量
@Override
public int getCount() {
return 50;
}
// 第position处的列表项内容
@Override
public Object getItem(int position) {
return null;
}
// 第position处的列表项id
@Override
public long getItemId(int position) {
return position;
}
// 第position处的列表项组件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = BaseActivity.this.getLayoutInflater().inflate(R.layout.lvi_simple, null);
viewHolder.ivLviTitle = convertView.findViewById(R.id.iv_lvi_simple_title);
viewHolder.tvLviName = convertView.findViewById(R.id.tv_lvi_simple_name);
viewHolder.tvLviDesc = convertView.findViewById(R.id.tv_lvi_simple_desc);
// 使用setTag方法将convertView和viewHolder关联起来
convertView.setTag(viewHolder);
}else {
// 当convertView不为空时,使用getTag方法获取到已有的组件
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.ivLviTitle.setImageResource(R.drawable.xian);
viewHolder.tvLviName.setText("第 " + position + " 个列表项");
viewHolder.tvLviDesc.setText("第 " + position + " 个列表项 说明");
return convertView;
}
};
static class ViewHolder {
ImageView ivLviTitle;
TextView tvLviName;
TextView tvLviDesc;
}
适配器封装:
/**
* BaseAdapter
*
* @param <T>
*/
abstract class BaseAdapter<T> extends android.widget.BaseAdapter {
private LayoutInflater inflater;
private List<T> mList;
private Context mContext;
public BaseAdapter(Context context, List<T> list) {
this.mContext = context;
this.mList = list;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mList.size() == 0 ? 0 : mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
ListView多布局适配器实现:
public class BAParticularsProcessAdapter extends BaseAdapter {
LayoutInflater inflater;
final int TYPE_1 = 0;
final int TYPE_2 = 1;
private List<Process> mList;
private Context mContext;
public BAParticularsProcessAdapter(Context context, List<Process> list) {
this.mContext = context;
this.mList = list;
}
@Override
public int getViewTypeCount() {
// 不同布局样式数量
return 2;
}
@Override
public int getItemViewType(int position) {
// 不同布局样式分配规则
if (position==0) {
return TYPE_1;
} else {
return TYPE_2;
}
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
int type = getItemViewType(position);
if (convertView == null) {
inflater = LayoutInflater.from(mContext);
switch (type) {
case TYPE_1:
convertView = inflater.inflate(R.layout.list_view_item_one, parent, false);
holder1 = new ViewHolder1();
holder1.mTvLvItemOne = (TextView) convertView.findViewById(R.id.tv_lv_item_user_one);
holder1.mTvLvItemTimeOne = (TextView) convertView.findViewById(R.id.tv_lv_item_time_one);
holder1.mCivLvItemOne = (ImageView) convertView.findViewById(R.id.civ_lv_item_one);
convertView.setTag(holder1);
break;
case TYPE_2:
convertView = inflater.inflate(R.layout.list_view_item_two, parent, false);
holder2 = new ViewHolder2();
holder2.mTvLvItemTwo = (TextView) convertView.findViewById(R.id.tv_lv_item_two);
holder2.mTvLvItemTimeTwo = (TextView) convertView.findViewById(R.id.tv_lv_item_time_two);
holder2.mCivLvItemTwo = (ImageView) convertView.findViewById(R.id.civ_lv_item__two);
convertView.setTag(holder2);
break;
}
} else {
switch (type) {
case TYPE_1:
holder1 = (ViewHolder1) convertView.getTag();
break;
case TYPE_2:
holder2 = (ViewHolder2) convertView.getTag();
break;
}
}
switch (type) {
case TYPE_1:
holder1.mTvLvItemOne.setText(
mList.get(position).getUname() + mList.get(position).getAcname() + " -- typeOne " + (position + 1));
holder1.mTvLvItemTimeOne.setText(mList.get(position).getTime());
if (TextUtils.isEmpty(mList.get(position).getUface())) {
holder1.mCivLvItemOne.setImageResource(R.drawable.ic_account_circle_black_24dp);
} else {
Glide.with(mContext).load(mList.get(position).getUface()).into( holder1.mCivLvItemOne);
}
break;
case TYPE_2:
holder2.mTvLvItemTwo.setText(
mList.get(position).getUname() + mList.get(position).getAcname() + " -- typeTwo " + (position + 1));
holder2.mTvLvItemTimeTwo.setText(mList.get(position).getTime());
if (TextUtils.isEmpty(mList.get(position).getUface())) {
holder2.mCivLvItemTwo.setImageResource(R.drawable.ic_account_circle_black_24dp);
} else {
Glide.with(mContext).load(mList.get(position).getUface()).into( holder2.mCivLvItemTwo);
}
break;
}
return convertView;
}
public static class ViewHolder1 {
TextView mTvLvItemOne;
TextView mTvLvItemTimeOne;
ImageView mCivLvItemOne;
}
public static class ViewHolder2 {
TextView mTvLvItemTwo;
TextView mTvLvItemTimeTwo;
ImageView mCivLvItemTwo;
}
}