第一行代码-常用adapter笔记

本文深入解析了ListView、RecyclerView和ViewPager自定义Adapter的实现方法,对比了ListView与RecyclerView在缓存机制、缓存内容及局部刷新支持上的差异。适用于希望深入了解Android列表控件优化的开发者。

1. ListView 自定义的adapter

不关心具体展示项,只需要负责展示项的滚动 adapter负责创建列表项的所有视图

class PhotoAdapter extends BaseAdapter {

@Override

public int getCount() {

return photos.size();

}

 

@Override

public NewsBean getItem(int position) {

return (NewsBean)photos.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 = View.inflate(mActivity, R.layout.item_photo_list, null);

holder = new ViewHolder();

holder.mTextView = convertView.findViewById(R.id.cardview_title);

holder.mImageView = convertView.findViewById(R.id.cardview_image);

convertView.setTag(holder);

} else {

holder = (ViewHolder)convertView.getTag();

}

holder.mTextView.setText(getItem(position).getTitle());

Glide.with(mActivity).load(getItem(position).getListimage()).into(holder.mImageView);

return convertView;

}

}

 

static class ViewHolder{

ImageView mImageView;

TextView mTextView;

}

 

 

2. RecycleView 的自定义adapter

回收再利用,循环往复 RecyclerView 自身不会创建视图,他创建的是ViewHolder 而ViewHolder

引用着itemview  RecyclerView 视图创建完成之后,必 需要有LayoutManager 的支持,

他把摆放屏幕的列表项,屏幕滚动行为, 这个任务交给了Layout Manager,

mRecyclerView.setLayoutManager(new GridLayoutManager(mActivity,2));

implementation 'com.android.support:recyclerview-v7:28.0.0'

 

class ReAdapter extends RecyclerView.Adapter<Vh> {

@NonNull

@Override

public Vh onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

View v = LayoutInflater.from(mActivity).inflate(R.layout.item_photo_list, viewGroup,false);

return new Vh(v);

}

 

@Override

public void onBindViewHolder(@NonNull Vh vh, int i) {

vh.bind(photos.get(i));

}

 

@Override

public int getItemCount() {

return photos.size();

}

}

 

class Vh extends RecyclerView.ViewHolder {

ImageView mImageView;

TextView mTextView;

public Vh(@NonNull View itemView) {

super(itemView);

mTextView = itemView.findViewById(R.id.cardview_title);

mImageView = itemView.findViewById(R.id.cardview_image);

}

 

public void bind(NewsBean bean) {

mTextView.setText(bean.getTitle());

Glide.with(mActivity).load(bean.getListimage()).into(mImageView);

}

}

 

 

3. viewpager 自定义 adapter

class LbAdapter extends PagerAdapter {

@Override

public int getCount() {

return mResponseDetailData.getData().getTopnews().size();

}

 

@Override

public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {

return view == o;

}

 

@NonNull

@Override

public Object instantiateItem(@NonNull ViewGroup container, int position) {

ImageView imageView = new ImageView(mActivity);

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

String iamgeurl = mResponseDetailData.getData().getTopnews().get(position).getTopimage();

Glide.with(mActivity)

.load(iamgeurl)

.into(imageView);

container.addView(imageView);

return imageView;

}

 

@Override

public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

container.removeView((View)object);

}

}

4. ListView 和RecyclerView 的区别

    ListView和RecyclerView都能很好地工作,两者并没有很大的差异:

    1. 缓存层级不同

    listView 两层缓存

    recyclerView 四层缓存

    RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共   用同一个RecyclerViewPool(缓存池)。

    2. 缓存内容不同

RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:

View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);不需要重绑定

ListView缓存View。

    3. recycler'View支持局部刷新

列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用RecyclerView,更加强大完善,易扩展;其它情况(如微信卡包列表页)两者都OK,但ListView在使用上会更加方便,快捷

<think>嗯,用户这次明确询问IT领域中"Adapter"的翻译含义,特别关注设计模式语境。结合用户引用过的四个适配器模式技术文档,需要同时解决术语翻译概念解释两个层次的需求。用户可能是开发者或计算机专业学生,正在学习设计模式。ta此前研究过"backbone"的翻译,说明对技术术语的准确性要求较高。这次提问虽短,但引用[1][2][3][4]都指向适配器模式,显然需要深度解析。核心术语翻译上,必须强调"适配器"是行业标准译名。有趣的是,用户引用[1]用"翻译员"比喻适配器模式,这个生活化类比可以保留在解释中。引用[3][4]提到的"接口转换"本质是重点,需用电路适配器的实物图片加强记忆点。技术解释要分层展开:先明确设计模式分类(结构型),再解释三个关键角色(Target/Adapter/Adaptee),最后用UML简图说明关系。用户引用[2]的C++代码示例很典型,但需要补充更通用的场景说明,比如支付接口适配或日志系统兼容。特别注意引用规范性:所有概念解释都要绑定具体引用来源。用户引用[4]提到的"降低改造风险"是工程价值核心,应该放在应用场景部分强调。最后生成的问题需延续设计模式学习路径,比如接口隔离原则或与代理模式对比。需要警惕的陷阱:避免把Adapter模式窄化为类继承实现,用户引用[2]显示ta已接触对象适配器(委托方式)。对象适配器更灵活这点必须点明,顺便解答ta可能隐含的"类适配器vs对象适配器"疑问。</think> 在IT领域,"Adapter"的标准中文翻译为**适配器**,其核心含义是**在不修改原有系统的基础上实现接口转换的中间层**。以下是详细解析: --- ### 🔧 **Adapter设计模式的中文翻译及含义** #### 1. **中文翻译** - **正式译法**:适配器模式(Adapter Pattern) - **别名**:包装器模式(Wrapper Pattern)[^3][^4] - **关键角色**: - `Target`(目标接口):用户期望的接口 - `Adaptee`(适配者):待适配的旧接口 - `Adapter`(适配器):转换接口的中间层 #### 2. **核心含义** 适配器模式通过封装变化解决接口不兼容问题,实现: $$ \text{旧系统(Adaptee)} \xrightarrow{\text{Adapter转换}} \text{新接口(Target)} $$ 例如: > 当新系统需调用旧支付接口时,适配器将新支付请求格式 `processPayment()` 转换为旧接口的 `legacyPay()` 方法[^1][^3]。 #### 3. **两类实现方式** | 类型 | 实现原理 | 代码示例(引用[2]) | |--------------|----------------------------|----------------------------------| | **类适配器** | 继承Adaptee类 + 实现Target接口 | `class Adapter: public Target, private Adaptee {}` | | **对象适配器**| 组合Adaptee对象(更常用) | ```cpp Adapter::Adapter(Adaptee* ade) { _ade = ade; } void Adapter::Request() { _ade->SpecificRequest(); } ```| --- ### 💻 **Adapter在开发中的翻译与应用** #### 1. **通用翻译** - **硬件语境**:电源适配器(如笔记本充电器实现220V→12V转换) - **软件语境**: - **接口适配器**:统一第三方SDK调用规范 - **数据适配器**:转换XML数据为JSON格式 #### 2. **典型场景** ```mermaid graph LR A[新客户端系统] -->|调用Target接口| B[Adapter] B -->|转换并调用| C[旧系统Adaptee] ``` - **兼容旧系统**:新日志框架接入旧日志接口[^4] - **整合第三方库**:统一不同地图API的坐标转换 - **协议转换**:将HTTP请求适配为MQTT协议 --- ### ⚠️ **适配器模式 vs 其他模式** | 模式 | 核心差异 | |------------|---------------------------| | **装饰器** | 增强功能,不改变接口 | | **代理** | 控制访问,接口与目标一致 | | **外观** | 简化复杂系统的统一入口 | > 💡 适配器的核心价值是**对抗不兼容性**,而非扩展功能[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值