美文网首页
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