第一行代码-常用adapter笔记

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

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

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在使用上会更加方便,快捷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值