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