项目需要的效果如图:
我想的是RecyclerView添加一个ViewPager头部实现。代码如下(Fragment.onActivityCreated()里的代码):
//init vp_banner;
vp_banner = getLayoutInflater().inflate(R.layout.life_header, null);
BannerAdapter bannerAdapter = new BannerAdapter(MyApplication.pics, this);
((ViewPager)vp_banner).setAdapter(bannerAdapter);
//init rv_items;
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false);
rv_items.setLayoutManager(gridLayoutManager);
initItems();
MainItemsAdapter adapter = new MainItemsAdapter(functionItemList, this, vp_banner);
rv_items.setAdapter(adapter);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0) {
return 3;
}
return 1;
}
});
MainItemAdapter.java:
public class MainItemsAdapter extends RecyclerView.Adapter<MainItemsAdapter.ViewHolder> implements View.OnClickListener {
private List<FunctionItem> functionItemList;
private final static int VIEW_HEADER = 1, VIEW_ITEM = 0;
private LayoutInflater layoutInflater;
private Context context;
private View header;
public MainItemsAdapter(List<FunctionItem> functionItemList, Context context, View header) {
this.functionItemList = functionItemList;
layoutInflater = LayoutInflater.from(context);
this.context = context;
this.header = header;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == VIEW_HEADER) {
return new ViewHolder(header, viewType);
} else {
view = layoutInflater.inflate(R.layout.life_item, null);
ViewHolder viewHolder = new ViewHolder(view, viewType);
viewHolder.ll_item.setOnClickListener(this);
return viewHolder;
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (getItemViewType(position) == VIEW_HEADER) {
// holder.vp_banner.setImageResource(MyApplication.pics[0]);
} else {
FunctionItem functionItem = functionItemList.get(position - 1);
holder.iv_itemPic.setImageResource(functionItem.getPic());
holder.tv_itemName.setText(functionItem.getName());
holder.ll_item.setTag(functionItem.getId());
}
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_HEADER;
} else {
return VIEW_ITEM;
}
}
@Override
public int getItemCount() {
return functionItemList.size() + 1;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.item) {
LogUtil.e("Life", "--->" + v.getTag());
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView iv_itemPic;
TextView tv_itemName;
LinearLayout ll_item;
public ViewHolder(View itemView, int viewType) {
super(itemView);
if (viewType == VIEW_HEADER) {
// init view pager
} else {
iv_itemPic = (ImageView) itemView.findViewById(R.id.itemPic);
tv_itemName = (TextView) itemView.findViewById(R.id.itemName);
ll_item = (LinearLayout) itemView.findViewById(R.id.item);
}
}
}
}
主布局文件:
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/items"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
life_header.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
BannerAdapter.java
public class BannerAdapter extends PagerAdapter {
int[] pics;
Context context;
public BannerAdapter(int[] pics, Context context) {
this.pics = pics;
this.context = context;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(context);
imageView.setImageResource(pics[position]);
container.addView(imageView);
return imageView;
}
@Override
public int getCount() {
return pics.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
目前的问题是ViewPager无法显示,打印输出高宽为0。不明为什么会这样,怎么解决,求高手指点。
问题已经解决。
需要修改两个地方:
1.
vp_banner = getLayoutInflater().inflate(R.layout.life_header, null);
需要改为vp_banner = getLayoutInflater().inflate(R.layout.life_header, fl_parent, false);
2.life_header.xml布局文件里的宽高需要使用Exactly模式(match_parent或者写死尺寸)