项目需要的效果如图:
我想的是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。不明为什么会这样,怎么解决,求高手指点。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题已经解决。
需要修改两个地方:
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或者写死尺寸)
我尝试了,目前没发现问题在哪,解不掉。
看你的代码和这个答案类似,你可以做下对比: http://stackoverflow.com/questions/26530685/is-there-an-addheaderview-equivalent-for-recyclerview
一个类似的答案 http://stackoverflow.com/questions/26448717/android-5-0-add-header-footer-to-a-recyclerview
但是我觉得这种做法有点儿复杂,所以,如果不是必须要采用这种方法的话,可以尝试使用lib,以下是我找到的星星最多的两个相关项目(我还没来得及验证)
https://github.com/blipinsk/RecyclerViewHeader
https://github.com/cundong/HeaderAndFooterRecyclerView
很遗憾未能看出你的问题在哪,需要提供更多信息,你的布局文件都是怎样的?
你把viewpager设定一个高度试试,比如250dp
你的问题解决了么?我也遇到同样的问题了