Closed BuMiangYang closed 4 years ago
不清楚你这边的情况,我再 demo 里将 layout_header.xml 即作为 RecyclerView 的 header 又左右其 item,测试没问题。如果你那边还有问题的话,辛苦写个有问题的 demo 传到 GitHub
layout_header.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<cn.bingoogolapple.bgabanner.BGABanner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="100dp"
android:scaleType="fitXY"
app:banner_pointDrawable="@drawable/selector_banner_unequal"
app:banner_indicatorGravity="bottom|right"
app:banner_pageChangeDuration="1500"
app:banner_placeholderDrawable="@drawable/holder"
app:banner_tipTextSize="12sp"
app:banner_transitionEffect="accordion"/>
</LinearLayout>
RecyclerViewDemoActivity.Java
public class RecyclerViewDemoActivity extends AppCompatActivity implements BGABanner.Adapter<ImageView, String>, BGABanner.Delegate<ImageView, String> {
private RecyclerView mContentRv;
private BGABanner mBanner;
private ContentAdapter mContentAdapter;
private Engine mEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview_demo);
mContentRv = findViewById(R.id.rv_content);
setTitle("RecyclerViewDemo");
mEngine = App.getInstance().getEngine();
initRecyclerView();
loadBannerData();
loadContentData();
}
/**
* 初始化RecyclerView
*/
private void initRecyclerView() {
// 初始化适配器
mContentAdapter = new ContentAdapter(mContentRv);
// 测试 item 点击事件
mContentAdapter.setOnRVItemClickListener(new BGAOnRVItemClickListener() {
@Override
public void onRVItemClick(ViewGroup parent, View itemView, int position) {
// 注意:即使加了 HeaderView,这里返回的 position 也是从 0 开始的,在 BGARecyclerViewAdapter 的内部已经帮开发者减去了 HeaderView
Toast.makeText(itemView.getContext(), "position = " + position + " " + mContentAdapter.getItem(position).title, Toast.LENGTH_SHORT).show();
}
});
// 添加 HeaderView
mContentAdapter.addHeaderView(getHeaderView());
RecyclerView.LayoutManager layoutManager;
// 测试 LinearLayoutManager 的情况
// layoutManager = new LinearLayoutManager(this);
// 测试 GridLayoutManager 的情况
layoutManager = new GridLayoutManager(this, 2);
mContentRv.setLayoutManager(layoutManager);
// 测试添加分割间隙
mContentRv.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
// 注意:由于加了一个 HeaderView,所以是大于 0 时才加分隔间隙。onCanvas 就不演示了
if (position > 0) {
int halfPadding = BGABannerUtil.dp2px(view.getContext(), 4);
outRect.set(halfPadding, halfPadding, halfPadding, halfPadding);
}
}
});
// 注意:这里调用了 getHeaderAndFooterAdapter 方法
mContentRv.setAdapter(mContentAdapter.getHeaderAndFooterAdapter());
}
/**
* 初始化 HeaderView
*
* @return
*/
private View getHeaderView() {
View headerView = View.inflate(this, R.layout.layout_header, null);
mBanner = headerView.findViewById(R.id.banner);
mBanner.setAdapter(this);
mBanner.setDelegate(this);
return headerView;
}
@Override
public void fillBannerItem(BGABanner banner, ImageView itemView, String model, int position) {
Glide.with(this)
.load(model)
.apply(new RequestOptions().placeholder(R.drawable.holder).error(R.drawable.holder).dontAnimate().centerCrop())
.into(itemView);
}
@Override
public void onBannerItemClick(BGABanner banner, ImageView imageView, String model, int position) {
Toast.makeText(this, "点击了第" + (position + 1) + "页", Toast.LENGTH_SHORT).show();
}
/**
* 加载头部广告条的数据
*/
private void loadBannerData() {
mEngine.fetchItemsWithItemCount(5).enqueue(new Callback<BannerModel>() {
@Override
public void onResponse(Call<BannerModel> call, Response<BannerModel> response) {
BannerModel bannerModel = response.body();
mBanner.setData(bannerModel.imgs, bannerModel.tips);
}
@Override
public void onFailure(Call<BannerModel> call, Throwable t) {
Toast.makeText(App.getInstance(), "加载广告条数据失败", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 加载内容列表数据
*/
private void loadContentData() {
mEngine.loadContentData("http://bgashare.bingoogolapple.cn/refreshlayout/api/defaultdata.json").enqueue(new Callback<List<RefreshModel>>() {
@Override
public void onResponse(Call<List<RefreshModel>> call, Response<List<RefreshModel>> response) {
mContentAdapter.setData(response.body());
}
@Override
public void onFailure(Call<List<RefreshModel>> call, Throwable t) {
Toast.makeText(App.getInstance(), "加载内容数据失败", Toast.LENGTH_SHORT).show();
}
});
}
private class ContentAdapter extends BGARecyclerViewAdapter<RefreshModel> {
public ContentAdapter(RecyclerView recyclerView) {
super(recyclerView, R.layout.layout_header);
}
@Override
protected void fillData(BGAViewHolderHelper helper, int position, RefreshModel model) {
final BGABanner banner = helper.getView(R.id.banner);
banner.setDelegate(RecyclerViewDemoActivity.this);
banner.setAdapter(RecyclerViewDemoActivity.this);
mEngine.fetchItemsWithItemCount(5).enqueue(new Callback<BannerModel>() {
@Override
public void onResponse(Call<BannerModel> call, Response<BannerModel> response) {
BannerModel bannerModel = response.body();
banner.setData(bannerModel.imgs, bannerModel.tips);
}
@Override
public void onFailure(Call<BannerModel> call, Throwable t) {
Toast.makeText(App.getInstance(), "加载广告条数据失败", Toast.LENGTH_SHORT).show();
}
});
}
}
}
item 布局如下: <cn.bingoogolapple.bgabanner.BGABanner android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="130dp" android:scaleType="fitXY" app:banner_indicatorGravity="bottom|right" app:banner_pointDrawable="@drawable/selector_banner_white" app:banner_placeholderDrawable="@drawable/placeholder_banner" app:banner_pointAutoPlayInterval="3000" app:banner_tipTextColor="@color/color_title_bg" app:banner_tipTextSize="@dimen/textSize_titleSmall" app:banner_transitionEffect="alpha" /> selector_banner_white: <selector xmlns:android="http://schemas.android.com/apk/res/android">
运行结果:除了指示 其他正常,app:banner_placeholderDrawable 属性添加只显示默认情况,不使用app:banner_placeholderDrawable 显示正常。