天天看點

第一行代碼-常用adapter筆記

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

繼續閱讀