上一节post获取到了数据,用josn工具转换为javabean后,定义为TravelModel,
将网络返回值修改为Observable<TravelModel>。
但是发现onNext(TravelModel travelModel)方法里并没有返回值。
在subscribe里面发现erroe方法:
public void onError(Throwable e) {
}
打印e的log后,发现错误
com.google.gson.JsonSyntaxException: 2018-12-01 23:11:33
这个错误是说josn数据解析的格式不对,后面附了一个2018-12-01 23:11:33。
是某个日期的格式不对。
去看这个post返回的josn数据,首先看到的是
{"ResponseStatus":{"Timestamp":"/Date(1572921124515+0800)/",",
但是似乎不是报的这个日期,而且flutter代码里,把ResponseStatus类和Extension类给删掉了,android这边删掉也还是报这个日期错误。
继续向下看,找到了
"publishTime":"2018-12-20 20:55:07"
正是这个。
去javabean里面查看这个publishTime,发现josn工具给定义的是private date publishTime;
这个date定义错了,改为String。这里面还有不少这样的date,都改为String。
此时再次编译运行,发现又报了一个错误:
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 39.919192
at line 1 column 10383 path $.resultList[2].article.images[0].lat
说这个地方,at line 1 column 10383 path $.resultList[2].article.images[0].lat
预期是int,但是...
找这个resultList[2].article.images[0].lat,,发现定义的是int,但是在josn数据里,是个小数,改为double就行了。
再运行,不报错了,得到了TravelModel。
遇到问题看报错信息一步一步解决就是了。
接着获取这个页面上面的tab信息。
是get,直接在网页上http://www.devio.org/io/flutter_app/json/travel_page.json。
然后用josn工具转换为javabean就行了。
其余的很简单。
@Headers("Content-Type: application/json")
@GET("/io/flutter_app/json/travel_page.json")
Observable<TravelTabModel> getTab();
像之前一样,获取网络数据就行了。
接下来根据数据实现tablayout。
由于是纯文字title的tablayout,直接用之前tablayout+viewpager的代码。
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
MainPresenter presenter = new MainPresenter(this);
presenter.getTravel();
presenter.getTravelTab();
View view = inflater.inflate(R.layout.travel_photo, null);
tabLayout = view.findViewById(R.id.travel_tab_layout);
viewPager = view.findViewById(R.id.tab_view_page);
initTabPager();
return view;
}
private void initTabPager() {
fragments.add(new Fragment1());
fragments.add(new Fragment1());
fragments.add(new Fragment1());
fragments.add(new Fragment1());
titles.add("首页");
titles.add("搜索");
titles.add("旅拍");
titles.add("我的");
fragmentAdapter = new MainFragmentAdapter(context.getSupportFragmentManager(),
fragments, titles);//viewpage的adapter
viewPager.setAdapter(fragmentAdapter);//viewpage设置adapter
//tabLayout.setSelectedTabIndicatorHeight(0);//去掉下划线
tabLayout.setupWithViewPager(viewPager);//viewpage和tablayout关联
}
这只是初始化,获取到网络数据后,我们需要刷新tablayout和viewpager。
由HomePageAdapter里面的
public void addData(HomeModel model) {
...
notifyDataSetChanged();
}
得到启示,在MainFragmentAdapter里面定义一个方法:
public void getData(List<Fragment> fragmentList, List<String> titles){
this.mFragmentList = fragmentList;
this.titles = titles;
notifyDataSetChanged();
}
然后在得到网络数据时,
public void getTravelTabModel(TravelTabModel travelTabModel) {
if(travelTabModel != null){
titles.clear();
fragments.clear();
for (int a=0;a<travelTabModel.getTabs().size();a++){
titles.add(travelTabModel.getTabs().get(a).getLabelName());
fragments.add(new Fragment1());
}
fragmentAdapter.getData(fragments,titles);
}
}
这样,tablayout就实现了,下一节实现viewpager。
另外,注意tablayout的item有很多时,加一个app:tabMode="scrollable"。
这样上面就不拥挤,还能滑动了。
网友评论