tablayout+viewpager+recycleview瀑

上一节实现了tablayout部分,viewpager内容用的空Fragment。现在来实现Fragment。
每个Fragment里面的数据,正是之前实现的post请求获得的,但是post参数里面,有个动态参数groupChannelCode。这个groupChannelCode是tablayout的TravelTabModel里面的。
根据groupChannelCode请求post,每个tablayout的tab下,对应着每个tab的数据。
上一节的fragments集合,修改为
fragments.add(new TravelTabFragment(context,travelTabModel.getTabs().get(a).getGroupChannelCode()));
根据travelTabModel里面,每个tab的groupChannelCode,来创建TravelTabFragment类:
public class TravelTabFragment extends BaseActivity {
TravelTabFragmentAdapter adapter;
String groupChannelCode;
Context context;
public TravelTabFragment(Context context,String groupChannelCode) {
this.context = context;
this.groupChannelCode = groupChannelCode;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
MainPresenter presenter = new MainPresenter(this);
presenter.getTravel(groupChannelCode);
View view = inflater.inflate(R.layout.travel_tab_fragment, null);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.travel_tab_recycler);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager( 2, RecyclerView.VERTICAL));
adapter = new TravelTabFragmentAdapter();
TravelModel travelModel = SPUtils.getInstance(context).get(ConstantsUtil.TRAVEL_FRAGMENT_DATA, TravelModel.class);
if(travelModel != null){
adapter.getData(travelModel);
}
recyclerView.setAdapter(adapter);
return view;
}
@Override
public void getTravelModel(TravelModel travelModel) {
if(travelModel!=null) {//滑动到不同的tab,都会请求一次getTravel,获取不同的结果。
SPUtils.getInstance(context).put(ConstantsUtil.TRAVEL_FRAGMENT_DATA, travelModel);
adapter.getData(travelModel);//所以,不改变请求的groupChannelCode,展示的图片也会改变。相当于刷新了。。
}
Log.v("abbb2", "==++++" + travelModel.getResultList().get(0).getArticle().getImages().get(0).getDynamicUrl());
}
}
recycleview瀑布流:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager( 2, RecyclerView.VERTICAL));
用presenter.getTravel(groupChannelCode);去请求数据:
public void getTravel(String groupChannelCode) {
Log.v("abbb", "111==");
Observable<TravelModel> observable = mModel.getTraver(groupChannelCode);
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TravelModel>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(TravelModel travelModel) {
travel = travelModel;
Log.v("abbb", "888==" + travel.getResultList().get(0).getArticle().getArticleTitle());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
mView.getTravelModel(travel);
}
});
}
public Observable<TravelModel> getTraver(String groupChannelCode) {
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),params);
//Observable<TravelModel> observable = RetrofitHelper.getInstance().getServer().getPhoto(TRAVEL_URL,body);
PagePara pagePara = new PagePara(1,10,9,0);
TravelPhotoResponse travelPhotoResponse = new TravelPhotoResponse(-1,groupChannelCode,
null,-180,-180,0,pagePara,1,"json");
Observable<TravelModel> observable = RetrofitHelper.getInstance().getServer().getPhoto(TRAVEL_URL,travelPhotoResponse);
return observable;
}
@Headers({
"cid: 09031014111431397988",
//"contentType: json",
"Content-Type: application/json",
"Accept: application/json"
})
@POST
Observable<TravelModel> getPhoto(@Url String url, @Body TravelPhotoResponse info);
此处,将之前的params请求json数据,换成了一个TravelPhotoResponse对象,通过构造函数,修改groupChannelCode的值。
(网上通过JSONObject 将字符串直接转换为javabean对象,因为JSONObject 导包问题较复杂,最终放弃。)
另外,添加了一个SPUtils类,用作本地存储数据,避免网络不好时,页面加载慢。
数据拿到了,再看看RecyclerView.Adapter具体实现:
public class TravelTabFragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
TravelModel travelModel;
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.v("sizee2","onCreateViewHolder==");
return new ItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.travel_item,
parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Log.v("sizee2","onBindViewHolder==");
if(travelModel == null){
return;
}
if (holder instanceof ItemHolder) {
if(travelModel.getResultList().get(position).getArticle() != null) {
((ItemHolder) holder).travelImage.setImageURL(travelModel.getResultList().get(position).getArticle().getImages().get(0).getDynamicUrl());
((ItemHolder) holder).userImage.setImageURL(travelModel.getResultList().get(position).getArticle().getAuthor().getCoverImage().getDynamicUrl());
((ItemHolder) holder).articleTitle.setText(travelModel.getResultList().get(position).getArticle().getArticleTitle());
((ItemHolder) holder).userName.setText(travelModel.getResultList().get(position).getArticle().getAuthor().getNickName());
((ItemHolder) holder).zanCount.setText(travelModel.getResultList().get(position).getArticle().getLikeCount() + "");
}
}
}
@Override
public int getItemCount() {
return 10;
}
public class ItemHolder extends RecyclerView.ViewHolder {
MyImageView travelImage;
CircleImageView userImage;
TextView articleTitle;
TextView userName;
TextView zanCount;
public ItemHolder(@NonNull View itemView) {
super(itemView);
travelImage = itemView.findViewById(R.id.travel_image);
userImage = itemView.findViewById(R.id.user_image);
articleTitle = itemView.findViewById(R.id.articleTitle);
userName = itemView.findViewById(R.id.user_name);
zanCount = itemView.findViewById(R.id.zanCount);
}
}
public void getData(TravelModel travelModel){
Log.v("sizee2","getData==");
this.travelModel = travelModel;
notifyDataSetChanged();
}
}
就是一个CardView布局。
具体代码如下:
https://github.com/doudousang/tablayout-viewpage-recycleview.git。
另外因为这个viewpager可能会与主页面的viewpager滑动冲突,最终将住viewpager的滑动事件屏蔽了。
参考代码:
Viewpager禁止左右滑动