美文网首页
tablayout+viewpager+瀑布流

tablayout+viewpager+瀑布流

作者: jiluyixia | 来源:发表于2019-11-05 17:29 被阅读0次

上一节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"。
这样上面就不拥挤,还能滑动了。

相关文章

网友评论

      本文标题:tablayout+viewpager+瀑布流

      本文链接:https://www.haomeiwen.com/subject/aahebctx.html