如果只是简单的实现单一的item,就只要重写下面的四个方法:int getCount():返回数据源中数据项的总数量
Object getItem(int position):根据position从数据源中获取数据项
long getItemId(int position): 根据position从数据源中获取数据项ID
View getView(int position, View convertView, ViewGroup parent):根据position创建View,它是Adapter中最重要的方法,listView通过它创建View。
如若要实现不同类型的item就需要再重写以下两种的方法:
int getViewTypeCount():返回item使用的View模式的总数量。
int getItemViewType(int position):根据position获取对应item使用的View模式。
adapter重点代码:
//表示我有多少个item的类型
private static final int ITEMCODE_VIDEO = 0;
private static final int ITEMCODE_GATHER = 1;
private static final int ITEMCODE_TEXT_FOOT = 2;
private static final int ITEMCODE_TEXT_HEADER = 3;
private static final int ITEMCODE_FOLLOW = 4;
//按类型返回
switch (type) {
case ITEMCODE_VIDEO://视频项
final VideoHolder videoHolder;
if (convertView == null) {
videoHolder = new VideoHolder();
convertView = mInflater.inflate(R.layout.item_home, parent, false);
ButterKnife.bind(videoHolder, convertView);
convertView.setTag(videoHolder);
} else {
videoHolder = (VideoHolder) convertView.getTag();
}
videoHolder.mTvHomeBottom.setText(DateFormatUtil.getDetail(dataBean));//设置类型和时间
videoHolder.mTvHomeTitle.getPaint().setFakeBoldText(true);//加粗
videoHolder.mTvHomeTitle.setText(dataBean.getTitle());//设置标题
if (mDatas.get(position).getType().equals("video")) {
Picasso.with(EyesApplication.getContext())
.load(dataBean.getCover().getDetail())
.resize(SizeUtils.dp2px(mContext, 500), SizeUtils.dp2px(mContext, 250))
.centerCrop()
.config(Bitmap.Config.RGB_565).into(videoHolder.mIvHomeContent);
}
//点击事件
videoHolder.mGroupHomeVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转到视频页面
Intent intent = new Intent(mContext, SelsetedActivity.class);
intent.putExtra(SelsetedActivity.DATA, dataBean);
//动画
if (android.os.Build.VERSION.SDK_INT > 20) {
mContext.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mContext, videoHolder.mIvHomeContent, "transitionImg").toBundle());
} else {
mContext.startActivity(intent);
}
}
});
return convertView;
case ITEMCODE_VIDEO://视频项
case...
}
//通过这个方法选取使用那个item的类型
@Override
public int getItemViewType(int position) {
String type = mDatas.get(position).getType();
Log.v("message", "类型:" + type + mDatas.get(position).getData().getTitle());
if ("videoCollectionOfFollow".equals(type)) {
return ITEMCODE_FOLLOW;
} else if ("videoCollectionWithCover".equals(type)) {
return ITEMCODE_GATHER;//集合项
} else if ("textHeader".equals(type)) {
return ITEMCODE_TEXT_HEADER;
} else if ("textFooter".equals(type)) {
return ITEMCODE_TEXT_FOOT;//文字项
}
return ITEMCODE_VIDEO;//视频项
}
//返回你有多少个item的类型
@Override
public int getViewTypeCount() {
return 5;
}
adapter所有代码:
public class HomeBaseAdapter extends BaseAdapter {
//表示我有多少个item的类型
private static final int ITEMCODE_VIDEO = 0;
private static final int ITEMCODE_GATHER = 1;
private static final int ITEMCODE_TEXT_FOOT = 2;
private static final int ITEMCODE_TEXT_HEADER = 3;
private static final int ITEMCODE_FOLLOW = 4;
private List<ItemListBean> mDatas;//数据的集合
private final Activity mContext;//连接上下文的Context
private final LayoutInflater mInflater;
public HomeBaseAdapter(Activity context) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
}
public void setData(List<ItemListBean> datas) {
mDatas = datas;
}
@Override
public int getCount() {
return mDatas != null ? mDatas.size() : 0;
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
final DataBean dataBean = mDatas.get(position).getData();
//按类型返回
switch (type) {
case ITEMCODE_VIDEO://视频项
final VideoHolder videoHolder;
if (convertView == null) {
videoHolder = new VideoHolder();
convertView = mInflater.inflate(R.layout.item_home, parent, false);
ButterKnife.bind(videoHolder, convertView);
convertView.setTag(videoHolder);
} else {
videoHolder = (VideoHolder) convertView.getTag();
}
videoHolder.mTvHomeBottom.setText(DateFormatUtil.getDetail(dataBean));//设置类型和时间
videoHolder.mTvHomeTitle.getPaint().setFakeBoldText(true);//加粗
videoHolder.mTvHomeTitle.setText(dataBean.getTitle());//设置标题
if (mDatas.get(position).getType().equals("video")) {
Picasso.with(EyesApplication.getContext())
.load(dataBean.getCover().getDetail())
.resize(SizeUtils.dp2px(mContext, 500), SizeUtils.dp2px(mContext, 250))
.centerCrop()
.config(Bitmap.Config.RGB_565).into(videoHolder.mIvHomeContent);
}
//点击事件
videoHolder.mGroupHomeVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转到视频页面
Intent intent = new Intent(mContext, SelsetedActivity.class);
intent.putExtra(SelsetedActivity.DATA, dataBean);
//动画
if (android.os.Build.VERSION.SDK_INT > 20) {
mContext.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mContext, videoHolder.mIvHomeContent, "transitionImg").toBundle());
} else {
mContext.startActivity(intent);
}
}
});
return convertView;
case ITEMCODE_GATHER://集合类型
GatherHolder gatherHolder;
if (convertView == null) {
gatherHolder = new GatherHolder();
convertView = mInflater.inflate(R.layout.item_home_gether, parent, false);
ButterKnife.bind(gatherHolder, convertView);
convertView.setTag(gatherHolder);
} else {
gatherHolder = (GatherHolder) convertView.getTag();
}
HomeHeader header = dataBean.getHeader();
Picasso.with(mContext).load(header.getCover())
.config(Bitmap.Config.RGB_565).into(gatherHolder.mIvHomeGatherHeader);
//设置recyclerview
gatherHolder.mRvHomeGatherContent.setLayoutManager(new GridLayoutManager(mContext, 1, LinearLayoutManager.HORIZONTAL, false));
HomeRvadapter rvadapter = new HomeRvadapter(mContext, dataBean);
gatherHolder.mRvHomeGatherContent.setAdapter(rvadapter);
return convertView;
case ITEMCODE_FOLLOW://热门推荐
FollwHolder follwHolder;
if (convertView == null) {
follwHolder = new FollwHolder();
convertView = mInflater.inflate(R.layout.item_home_follw, parent, false);
ButterKnife.bind(follwHolder, convertView);
convertView.setTag(follwHolder);
} else {
follwHolder = (FollwHolder) convertView.getTag();
}
HomeHeader floowHeader = dataBean.getHeader();
follwHolder.mTvFollwTitle.getPaint().setFakeBoldText(true);
follwHolder.mTvFollwTitle.setText(floowHeader.getTitle());
follwHolder.mTvFollwDetail.setText(floowHeader.getDescription());
//设置recyclerview
follwHolder.mRvHomeFollwContent.setLayoutManager(new GridLayoutManager(mContext, 1, LinearLayoutManager.HORIZONTAL, false));
HomeRvadapter floowAdapter = new HomeRvadapter(mContext, dataBean);
follwHolder.mRvHomeFollwContent.setAdapter(floowAdapter);
return convertView;
case ITEMCODE_TEXT_FOOT://底部文字类型
convertView = mInflater.inflate(R.layout.item_home_foottext, parent, false);
TextView footTv = (TextView) convertView.findViewById(R.id.tv_home_foottext);
//设置数据
String footText = dataBean.getText();
if (!TextUtils.isEmpty(footText)) {
footTv.setText(footText);
}
return convertView;
case ITEMCODE_TEXT_HEADER://顶部文字类型
convertView = mInflater.inflate(R.layout.item_home_heandertext, parent, false);
TextView headerTv = (TextView) convertView.findViewById(R.id.tv_home_handertext);
//添加自定义字体及字体加粗
Typeface face = Typeface.createFromAsset (EyesApplication.getContext().getAssets(),"fonts/timesi.ttf");
headerTv.setTypeface(face);
TextPaint tp = headerTv.getPaint();
tp.setFakeBoldText(true);
//设置数据
String handText = dataBean.getText();
if (!TextUtils.isEmpty(handText)) {
Spanned fromHtml = Html.fromHtml("<font color='black' font='" + dataBean.getFont() + "' size='24'>" + dataBean.getText() + "</font>");
headerTv.setText(fromHtml);
}
return convertView;
}
return null;
}
//通过这个方法选取使用那个item的类型
@Override
public int getItemViewType(int position) {
String type = mDatas.get(position).getType();
Log.v("message", "类型:" + type + mDatas.get(position).getData().getTitle());
if ("videoCollectionOfFollow".equals(type)) {
return ITEMCODE_FOLLOW;
} else if ("videoCollectionWithCover".equals(type)) {
return ITEMCODE_GATHER;//集合项
} else if ("textHeader".equals(type)) {
return ITEMCODE_TEXT_HEADER;
} else if ("textFooter".equals(type)) {
return ITEMCODE_TEXT_FOOT;//文字项
}
return ITEMCODE_VIDEO;//视频项
}
//返回你有多少个item的类型
@Override
public int getViewTypeCount() {
return 5;
}
public static class VideoHolder {//这里的我是使用黄油刀获取的holder,你们可以使用findViewById
@Bind(R.id.group_home_video)
RelativeLayout mGroupHomeVideo;
@Bind(R.id.iv_home_content)
ImageView mIvHomeContent;
@Bind(R.id.tv_home_title)
TextView mTvHomeTitle;
@Bind(R.id.tv_home_bottom)
TextView mTvHomeBottom;
}
public static class GatherHolder {
@Bind(R.id.iv_home_gather_header)
ImageView mIvHomeGatherHeader;
@Bind(R.id.rv_home_gather_content)
RecyclerView mRvHomeGatherContent;
}
public static class FollwHolder {
@Bind(R.id.tv_follw_title)
TextView mTvFollwTitle;
@Bind(R.id.tv_follw_detail)
TextView mTvFollwDetail;
@Bind(R.id.rv_home_follw_content)
RecyclerView mRvHomeFollwContent;
}
}