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在使用上會更加友善,快捷