慕课网ListViewCommonAdapter万能适配器代码摘要

本文详细介绍了ViewHolder模式和CommonAdapter的具体实现方式,包括ViewHolder类的主要方法、CommonAdapter抽象类的代码解析,以及如何在实际项目中应用这些模式来提高ListView性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ViewHolder类中代码  主要三个方法加上构造方法
        主要三个方法:get(),getView(),getConvertView();
public class ViewHolder {
SparseArray<View> mView;//这是一种<以int做键,object做值>的更高效的Map
int mPosition;
View mConvertView;
public ViewHolder(Context context, int position, ViewGroup parent, int layoutId){
this.mPosition=position;
this.mView=new SparseArray<>();
mConvertView=LayoutInflater.from(context).inflate(layoutId,null);
mConvertView.setTag(this);

}
public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId,int position){

if (convertView==null){

return new ViewHolder(context,position,parent,layoutId);

}else {
ViewHolder holder= (ViewHolder) convertView.getTag();
holder.mPosition=position;
return holder;
}
}


public <T extends View> T getView(int viewId){
View view=mView.get(viewId);
if (view==null){
view=mConvertView.findViewById(viewId);
mView.put(viewId,view);
}
return (T)view;
}

public View getConvertView(){

return mConvertView;
}
//辅助:将convert方法继续简化,可以为常用的textView,imageView 等添加同类方法
public ViewHolder setText(int viewId,String text){
TextView tv=getView(viewId);
tv.setText(text);
return this;
}
//使用getPosition结合List<Integer>可以配合点击事件保存选中Item项
public int getPosition() {
return mPosition;
}


}
2.CommonAdapter 抽象类类中的代码
    重点解析:通过提供抽象convert()方法分解出getView()方法中的不易复用的代码功能
public abstract class CommonAdapter<T> extends BaseAdapter{

Context context;
List<T> mDatas;
int mlayoutId;

public CommonAdapter(List<T> mDatas, Context context,int layoutId) {

this.mDatas = mDatas;
this.context = context;
this.mlayoutId=layoutId;
}

@Override
public int getCount() {
return mDatas.size();
}

@Override
public T getItem(int position) {
return mDatas.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder viewHolder=ViewHolder.get(context,convertView,parent,mlayoutId, position);

convert(viewHolder,this.getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder holder,T t);
}
3.不考虑ListView点击事件等后续情况可以在Activity中使用匿名内部类的方式创建适配器对象,代码如下:
 list.setAdapter(new CommonAdapter<Bean>(beanList,this,R.layout.list_item) {
    @Override
public void convert(ViewHolder viewHolder, final Bean bean) {
viewHolder.setText(R.id.id_title,bean.getTitle())
.setText(R.id.id_desc,bean.getDesc())
.setText(R.id.id_time,bean.getTime())
.setText(R.id.id_phone,bean.getPhone());//使用链式编程简化代码
//配合CheckBox使用,解决convertView复用后CheckBox的选中问题
   //这种写法实在bean中有isChecked属性来保存CheckBox的选中状态的请况下
final CheckBox cb=viewHolder.getView(R.id.id_check);
cb.setChecked(bean.getChecked());

cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bean.setChecked(cb.isChecked());
}
});
}
});

4.考虑的ListView的点击事件等等情况,不适合用匿名内部类的时候就用外部类,也很方便:
public class YouAdapter extends CommonAdapter<Bean>{

List<Integer> mPos=new ArrayList<>();//定义一个集合来保存选中项

public YouAdapter( List<Bean> mDatas,Context context,int layoutId) {
super(mDatas,context,layoutId);
}



//现在YouAdapter里只有一个方法,建议使用匿名内部类的写法简化
@Override
public void convert(final ViewHolder viewHolder, final Bean bean) {
((TextView)viewHolder.getView(R.id.id_title)).setText(bean.getTitle());
((TextView)viewHolder.getView(R.id.id_desc)).setText(bean.getDesc());
((TextView)viewHolder.getView(R.id.id_time)).setText(bean.getTime());
((TextView)viewHolder.getView(R.id.id_phone)).setText(bean.getPhone());


final CheckBox cb=viewHolder.getView(R.id.id_check);
// cb.setChecked(bean.getChecked());
//
// cb.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// bean.setChecked(cb.isChecked());

// }
// });
//或者在bean中没有isCheck的属性来保存是否选中,可以定义一个List<Integer>集合来保存所选中Item
cb.setChecked(false);
if (mPos.contains(viewHolder.getPosition())){
cb.setChecked(true);
}
cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if (cb.isChecked()) {
mPos.add(viewHolder.getPosition());
}else{
mPos.remove((Integer) viewHolder.getPosition());
}
}
});
}
}
内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值