listview以垂直形式显示所有的列表项,展示需要实现setadapter(adapter)方法,由adapter提供列表项,包括子项的布局和数据,以baseadapter为例,baseadapter易于扩展,能对各列表项最大限度定制。
以学生列表展示为例:
实体类:提供学生信息的基本get,set以及初始化方法。
baseadapter:加载子项布局并完成子布局和数据的绑定。
初始化:
ArrayList<Teacher_Class> listString;
ArrayList<TClassStudent> stuList;
Context mContext;
LayoutInflater inflater;
int type;
//type如果等于1,就是课表,0就是在老师端点进班级时查看的学生列表,等于2时为老师查看点到情况时加载的学生信息,以学生姓名和迟到次数展示,
// 然后分别相应不同的点击事件,学生端课表点进去后即为不可更改的学生信息
// ,老师端课表点击去后为学生列表,以姓名和id体现,点击去后为可修改的学生信息
public ListAdapter(Context context, ArrayList listString,int type) {
// TODO Auto-generated constructor stub
mContext = context;
inflater = LayoutInflater.from(mContext);
this.type=type;
if (type==1)
{
this.listString=listString;
}
if (type==0||type==2)
{
this.stuList=listString;
}
}
接下来,实现该接口的所有方法:
得到该类型数量:
@Override
public int getCount() {
// TODO Auto-generated method stub
if (type==1)
{
return listString.size();
}
if (type==0||type==2)
{
return stuList.size();
}
return 0;
}
//每个convert view都会调用此方法,获得当前所需要的view样式
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return type;
}
得到总的类型数目:
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 3;
}
得到数据单个实体对象:
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
if (type==1)
{
return listString.get(arg0);
}
if (type==0||type==2)
{
return stuList.get(arg0);
}
return 0;
}
得到子项ID
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
接下来,最重要的是绑定子项数据和它的视图,采用convertview进行优化,加载界面,如果有则可以通过它的getTag()方法加载缓存,如果没有,可以通过setTag(相关holder)对视图进行缓存,便于之后加载,然后设置holder的子项控件相关方法进行显示数据,如图片文字,并返回布局即可。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
viewHolder1 holder1 = null;
viewHolder2 holder2=null;
viewHolder3 holder3=null;
int ty=getItemViewType(position);
//无convertView,需要new出各个控件
if(convertView == null)
{
Log.e("convertView = ", " NULL");
if (ty==1)
{
convertView = inflater.inflate(R.layout.class_item, parent, false);
holder1 = new viewHolder1();
holder1.textView = (TextView)convertView.findViewById(R.id.class_item);
Log.d("convertView = ", "NULL TYPE_1");
convertView.setTag(holder1);
}
if (ty==0)
{
convertView = inflater.inflate(R.layout.stu_item, parent, false);
holder2 = new viewHolder2();
holder2.name = (TextView)convertView.findViewById(R.id.name);
holder2.id = (TextView)convertView.findViewById(R.id.id);
Log.d("convertView = ", "NULL TYPE_2");
convertView.setTag(holder2);
}
if (ty==2)
{
convertView = inflater.inflate(R.layout.stu_item, parent, false);
holder3 = new viewHolder3();
holder3.name = (TextView)convertView.findViewById(R.id.name);
holder3.absent = (TextView)convertView.findViewById(R.id.id);
Log.d("convertView = ", "NULL TYPE_3");
convertView.setTag(holder3);
}
}
else
{
if (ty==1)
{ //有convertView,按样式,取得不用的布局
holder1 = (viewHolder1) convertView.getTag();
}
if (ty==0)
{ //有convertView,按样式,取得不用的布局
holder2 = (viewHolder2) convertView.getTag();
}
if (ty==2)
{ //有convertView,按样式,取得不用的布局
holder3 = (viewHolder3) convertView.getTag();
}
}
//设置资源
if (ty==1)
{
holder1.textView.setText(listString.get(position).getClassName());
holder1.build((Teacher_Class) getItem(position));
}
if (ty==0)
{
holder2.name.setText(stuList.get(position).getS_Name());
holder2.id.setText(stuList.get(position).getS_Id());
holder2.build((TClassStudent) getItem(position));
}
if (ty==2)
{
holder3.name.setText(stuList.get(position).getS_Name());
holder3.absent.setText(Integer.toString(stuList.get(position).getS_Count()));
holder3.build((TClassStudent) getItem(position));
}
return convertView;
}
相关holder如下:定义holder子数据的类型以及响应事件。
class viewHolder1{
TextView textView;
Teacher_Class item=null;
public void build(Teacher_Class teacher_class)
{
this.item=teacher_class;
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"hh",Toast.LENGTH_SHORT).show();
//Intent intent=new Intent(mContext, StudentList.class);
//startActivity(intent);
StudentList.actionStart(mContext, item.getTClass_Id(),type);
}
});
}
}
class viewHolder2{
TextView name;
TextView id;
TClassStudent item=null;
public void build(TClassStudent tClassStudent)
{
this.item=tClassStudent;
name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("click = ", "managesutdent");
Toast.makeText(mContext, "hh", Toast.LENGTH_SHORT).show();
//Intent intent=new Intent(mContext, StudentList.class);
//startActivity(intent);
OneStudent.actionStart(mContext, item);
}
});
id.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("click = ", "managesutdent");
// Toast.makeText(mContext, "hh", Toast.LENGTH_SHORT).show();
// Intent intent=new Intent(mContext, StudentList.class);
//startActivity(intent);
OneStudent.actionStart(mContext, item);
}
});
}
}
class viewHolder3{
TextView name;
TextView absent;
TClassStudent item=null;
public void build(TClassStudent tClassStudent)
{
this.item=tClassStudent;
name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("click = ", "managesutdent");
Toast.makeText(mContext, "hh", Toast.LENGTH_SHORT).show();
//Intent intent=new Intent(mContext, StudentList.class);
//startActivity(intent);
OneStudent.actionStart(mContext, item);
}
});
absent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("click = ", "managesutdent");
Toast.makeText(mContext, "hh", Toast.LENGTH_SHORT).show();
// Intent intent=new Intent(mContext, StudentList.class);
//startActivity(intent);
OneStudent.actionStart(mContext, item);
}
});
}
}