TouTiao开源项目 分析笔记19 问答内容

1.真实页面预览

1.1.成果预览

  

  首先是问答列表

  然后每个item设置点击事件,进入问答内容列表

  然后每一个问答内容也设置点击事件,进入问答详情

1.2.触发事件。

  在WendaArticleOneImgViewBinder中,设置item的点击事件,

  跳转到WendaContentActivity。

  在WendaArticleTextViewBinder中,设置item的点击事件,

  跳转到WendaContentActivity。

  在WendaArticleThreeImgViewBinder中,设置item的点击事件,

  跳转到WendaContentActivity。

2.问答内容的活动页面

2.1.源代码  

public class WendaContentActivity extends BaseActivity {

    private static final String TAG = "WendaContentActivity";

    public static void launch(String qid) {
        InitApp.AppContext.startActivity(new Intent(InitApp.AppContext, WendaContentActivity.class)
                .putExtra(TAG, qid)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.container);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, WendaContentFragment.newInstance(getIntent().getStringExtra(TAG)))
                .commit();
    }
}

2.2.需要的布局==>container.xml

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/viewBackground"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fragment_news_tab"/>

2.3.清单中活动配置

<activity
            android:name=".module.wenda.content.WendaContentActivity"
            android:configChanges="orientation|screenSize|uiMode"
            android:theme="@style/AppTheme.NoActionBar.Slidable"/>

2.4.现在还需要问答内容的片段了。

3.问答内容片段

3.1.底层接口==>IWendaContent 

public interface IWendaContent {

    interface View extends IBaseListView<Presenter> {

        /**
         * 请求数据
         */
        void onLoadData();

        /**
         * 刷新
         */
        void onRefresh();

        /**
         * 设置顶部信息
         */
        void onSetHeader(WendaContentBean.QuestionBean questionBean);
    }

    interface Presenter extends IBasePresenter {

        /**
         * 设置顶部信息
         */
        void doSetHeader(WendaContentBean.QuestionBean questionBean);

        /**
         * 请求数据
         */
        void doLoadData(String qid);

        /**
         * 再起请求数据
         */
        void doLoadMoreData();

        /**
         * 设置适配器
         */
        void doSetAdapter(List<WendaContentBean.AnsListBean> list);

        /**
         * 加载完毕
         */
        void doShowNoMore();
    }
}

3.2.源代码 

public class WendaContentFragment extends BaseListFragment<IWendaContent.Presenter> implements IWendaContent.View {

    private static final String TAG = "WendaContentFragment";
    private String qid;
    private String shareTitle;
    private String shareUrl;
    private WendaContentBean.QuestionBean WendaContentHeaderBean;

    public static WendaContentFragment newInstance(String qid) {
        Bundle args = new Bundle();
        args.putString(TAG, qid);
        WendaContentFragment fragment = new WendaContentFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void setPresenter(IWendaContent.Presenter presenter) {
        if (null == presenter) {
            this.presenter = new WendaContentPresenter(this);
        }
    }

    @Override
    public void onSetAdapter(List<?> list) {
        Items newItems = new Items();
        newItems.add(WendaContentHeaderBean);
        newItems.addAll(list);
        newItems.add(new LoadingBean());
        DiffCallback.notifyDataSetChanged(oldItems, newItems, DiffCallback.WENDA_CONTENT, adapter);
        oldItems.clear();
        oldItems.addAll(newItems);
        canLoadMore = true;
    }

    @Override
    protected int attachLayoutId() {
        return R.layout.fragment_list_toolbar;
    }

    @Override
    protected void initView(View view) {
        super.initView(view);
        Toolbar toolbar = view.findViewById(R.id.toolbar);
        initToolBar(toolbar, true, getString(R.string.title_wenda));
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                recyclerView.smoothScrollToPosition(0);
            }
        });
        toolbar.setBackgroundColor(SettingUtil.getInstance().getColor());

        adapter = new MultiTypeAdapter(oldItems);
        Register.registerWendaContentItem(adapter);
        recyclerView.setAdapter(adapter);
        recyclerView.addOnScrollListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                if (canLoadMore) {
                    canLoadMore = false;
                    presenter.doLoadMoreData();
                }
            }
        });
        setHasOptionsMenu(true);
    }

    @Override
    protected void initData() {
        this.qid = getArguments().getString(TAG);
        onLoadData();
    }

    @Override
    public void onLoadData() {
        onShowLoading();
        presenter.doLoadData(qid);
    }

    @Override
    public void onRefresh() {
        recyclerView.smoothScrollToPosition(0);
        presenter.doRefresh();
    }

    @Override
    public void onSetHeader(WendaContentBean.QuestionBean questionBean) {
        this.shareTitle = questionBean.getShare_data().getTitle();
        this.shareUrl = questionBean.getShare_data().getShare_url();
        this.WendaContentHeaderBean = questionBean;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_wenda_content, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_wenda_share) {
            IntentAction.send(getActivity(), shareTitle + "\n" + shareUrl);
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void fetchData() {

    }
}

  ①新建一个实例,传入一个问答id,返回一个片段。

  ②重写设置处理器,新建了一个。

  ③重写视图层的设置适配器,传入一个List,处理新老数据。

  ④重写初始化视图。

    获取toolbar,并设置点击事件。

    设置recyclerView的适配器,并设置滑动监听事件。

    设置菜单。

  ⑤重写初始化数据。

    从arguments获取问答id。

    然后调用加载数据的函数。

  ⑥重写加载数据的函数。

    先显示Loading。

    然后调用处理器的加载函数。

  ⑦重写刷新函数。

    先将recyclerView滑到最上面。

    然后调用处理器的刷新函数。

  ⑧重写设置头部。传入一个Bean。获取分享的标题和url。

  ⑨重写菜单以及菜单的点击事件。

3.3.需要的菜单布局  

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_wenda_share"
        android:icon="@drawable/ic_share_white_24dp"
        android:title="@string/action_share"
        app:showAsAction="ifRoom"/>

</menu>

  预览页面:

  

4.设置处理器

4.1.处理器源代码

public class WendaContentPresenter implements IWendaContent.Presenter {
    private static final String TAG = "WendaContentPresenter";
    private IWendaContent.View view;
    private String qid;
    private int niceOffset = 0;
    private int normalOffset = 0;
    private int niceAnsCount = 0;
    private int normalAnsCount = 0;
    private List<WendaContentBean.AnsListBean> ansList = new ArrayList<>();
    private String title;

    WendaContentPresenter(IWendaContent.View view) {
        this.view = view;
    }

    public void doRefresh() {
        if (ansList.size() != 0) {
            ansList.clear();
            niceOffset = 0;
            normalOffset = 0;
        }
        doLoadData(this.qid);
    }

    @Override
    public void doShowNetError() {
        view.onHideLoading();
        view.onShowNetError();
    }

    @Override
    public void doLoadData(String qid) {
        this.qid = qid;
        Log.d(TAG, "doLoadArticle: " + qid);

        RetrofitFactory.getRetrofit().create(IMobileWendaApi.class).getWendaNiceContent(qid)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<WendaContentBean>() {
                    @Override
                    public void accept(@NonNull WendaContentBean wendaContentBean) throws Exception {
                        doSetHeader(wendaContentBean.getQuestion());
                        doSetAdapter(wendaContentBean.getAns_list());
                        niceOffset += 10;
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(@NonNull Throwable throwable) throws Exception {
                        doShowNetError();
                        ErrorAction.print(throwable);
                    }
                });
    }

    @Override
    public void doLoadMoreData() {

        if (niceOffset < niceAnsCount) {
            RetrofitFactory.getRetrofit().create(IMobileWendaApi.class)
                    .getWendaNiceContentLoadMore(qid, niceOffset)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<WendaContentBean>() {
                        @Override
                        public void accept(@NonNull WendaContentBean wendaContentBean) throws Exception {
                            doSetAdapter(wendaContentBean.getAns_list());
                            niceOffset += 10;
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(@NonNull Throwable throwable) throws Exception {
                            doShowNetError();
                            ErrorAction.print(throwable);
                        }
                    });
        } else if (normalOffset < normalAnsCount) {
            RetrofitFactory.getRetrofit().create(IMobileWendaApi.class)
                    .getWendaNormalContentLoadMore(qid, normalOffset)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<WendaContentBean>() {
                        @Override
                        public void accept(@NonNull WendaContentBean wendaContentBean) throws Exception {
                            doSetAdapter(wendaContentBean.getAns_list());
                            normalOffset += 10;
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(@NonNull Throwable throwable) throws Exception {
                            doShowNetError();
                            ErrorAction.print(throwable);
                        }
                    });
        } else {
            doShowNoMore();
        }
    }

    @Override
    public void doSetAdapter(List<WendaContentBean.AnsListBean> list) {
        for (WendaContentBean.AnsListBean bean : list) {
            bean.setTitle(this.title);
            bean.setQid(this.qid);
        }
        ansList.addAll(list);
        view.onSetAdapter(ansList);
        view.onHideLoading();
    }

    @Override
    public void doSetHeader(WendaContentBean.QuestionBean questionBean) {
        this.niceAnsCount = questionBean.getNice_ans_count();
        this.normalAnsCount = questionBean.getNormal_ans_count();
        this.title = questionBean.getTitle();
        view.onSetHeader(questionBean);
    }

    @Override
    public void doShowNoMore() {
        view.onHideLoading();
        if (ansList.size() > 0) {
            view.onShowNoMore();
        }
    }
}

4.2.处理器的构造函数。

  传入了一个视图层,方便处理视图。

4.3.刷新函数。

  将之前的列表清空,然后调用处理器的加载函数即可。

4.4.处理网络异常。

4.5.处理器的加载函数。

  传入了一个问答Id。

  调用API去请求问答内容。

  然后在subscribe进行下一步处理。

4.6.处理器的加载更多函数。

  没有传递任何参数。

  调用API去请求问答更多内容。

  然后在subscribe中进行下一步处理。

4.7.处理器的设置适配器函数。

  传递了一个List。

  然后调用视图层的设置适配器,并将这个List传给它。

  

4.8.处理器的设置头部。

  传入了一个问题Bean类型。

  调用视图层的设置头部信息。

4.9.处理器的没有更多了。

  调用视图层的隐藏加载+没有更多了。

5.注册数据类型

5.1.统一管理

/**
     * 注册问答内容
     * @param adapter
     */
    public static void registerWendaContentItem(@NonNull MultiTypeAdapter adapter) {
        adapter.register(WendaContentBean.QuestionBean.class, new WendaContentHeaderViewBinder());
        adapter.register(WendaContentBean.AnsListBean.class, new WendaContentViewBinder());
        adapter.register(LoadingBean.class, new LoadingViewBinder());
        adapter.register(LoadingEndBean.class, new LoadingEndViewBinder());
    }

5.2.问答头部绑定器==>WendaContentHeaderViewBinder

  源代码:

public class WendaContentHeaderViewBinder extends ItemViewBinder<WendaContentBean.QuestionBean, WendaContentHeaderViewBinder.ViewHolder> {

    @NonNull
    @Override
    protected WendaContentHeaderViewBinder.ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
        View view = inflater.inflate(R.layout.item_wenda_content_header, parent, false);
        return new ViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, @NonNull final WendaContentBean.QuestionBean item) {
        try {
            String tv_title = item.getTitle();
            String tv_abstract = item.getContent().getText();

            String tv_answer_count = item.getNormal_ans_count() + item.getNice_ans_count() + " 回答";
            String tv_follow_count = item.getFollow_count() + " 关注";
            holder.tv_title.setText(tv_title);
            if (!TextUtils.isEmpty(tv_abstract)) {
                holder.tv_abstract.setText(tv_abstract);
            } else {
                holder.tv_abstract.setVisibility(View.GONE);
            }
            holder.tv_answer_count.setText(tv_answer_count);
            holder.tv_follow_count.setText(tv_follow_count);
            holder.title_view.setBackgroundColor(SettingUtil.getInstance().getColor());
        } catch (Exception e) {
            ErrorAction.print(e);
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_title;
        private TextView tv_abstract;
        private TextView tv_answer_count;
        private TextView tv_follow_count;
        private LinearLayout title_view;

        public ViewHolder(View itemView) {
            super(itemView);
            this.tv_title = itemView.findViewById(R.id.tv_title);
            this.tv_abstract = itemView.findViewById(R.id.tv_abstract);
            this.tv_answer_count = itemView.findViewById(R.id.tv_answer_count);
            this.tv_follow_count = itemView.findViewById(R.id.tv_follow_count);
            this.title_view = itemView.findViewById(R.id.title_view);
        }
    }
}

  需要的布局==>item_wenda_content.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/title_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="8dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="0dp">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textColor="@color/White"
            tools:text="都说床头不能朝西,有什么说法吗?"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title_view"
        android:background="@color/viewBackground"
        android:orientation="vertical"
        android:paddingBottom="8dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="8dp">

        <TextView
            android:id="@+id/tv_abstract"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            tools:text="都说床头不能朝西,可是我家设计的两个卧室都是不得不朝西的啊!有什么不好吗?"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_answer_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="14sp"
                tools:text="602个回答"/>

            <TextView
                android:id="@+id/tv_follow_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                android:textSize="14sp"
                tools:text="68关注"/>

        </LinearLayout>
    </LinearLayout>

    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_below="@+id/content"
        android:background="@color/line_divider"/>

</RelativeLayout>

  预览图片:

  

  

5.3.问答列表绑定视图

  源代码: 

public class WendaContentViewBinder extends ItemViewBinder<WendaContentBean.AnsListBean, WendaContentViewBinder.ViewHolder> {

    @NonNull
    @Override
    protected WendaContentViewBinder.ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
        View view = inflater.inflate(R.layout.item_wenda_content, parent, false);
        return new ViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, @NonNull final WendaContentBean.AnsListBean item) {
        try {
            String iv_user_avatar = item.getUser().getAvatar_url();
            ImageLoader.loadCenterCrop(holder.itemView.getContext(), iv_user_avatar, holder.iv_user_avatar, R.color.viewBackground);
            String tv_user_name = item.getUser().getUname();
            String tv_like_count = item.getDigg_count() + "";
            String tv_abstract = item.getContent_abstract().getText();
            holder.tv_user_name.setText(tv_user_name);
            holder.tv_like_count.setText(tv_like_count);
            holder.tv_abstract.setText(tv_abstract);

            RxView.clicks(holder.itemView)
                    .throttleFirst(1, TimeUnit.SECONDS)
                    .subscribe(new Consumer<Object>() {
                        @Override
                        public void accept(@io.reactivex.annotations.NonNull Object o) throws Exception {
                            //WendaDetailActivity.launch(item);
                        }
                    });
        } catch (Exception e) {
            ErrorAction.print(e);
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private CircleImageView iv_user_avatar;
        private TextView tv_user_name;
        private TextView tv_like_count;
        private TextView tv_abstract;

        public ViewHolder(View itemView) {
            super(itemView);
            this.iv_user_avatar = itemView.findViewById(R.id.iv_user_avatar);
            this.tv_user_name = itemView.findViewById(R.id.tv_user_name);
            this.tv_like_count = itemView.findViewById(R.id.tv_like_count);
            this.tv_abstract = itemView.findViewById(R.id.tv_abstract);
        }
    }
}

  需要的item布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/viewBackground">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/selectableItemBackground"
        android:foreground="?attr/selectableItemBackground"
        android:orientation="vertical"
        android:padding="16dp">

        <LinearLayout
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <com.jasonjan.headnews.widget.CircleImageView
                android:id="@+id/iv_user_avatar"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:scaleType="centerCrop"/>

            <TextView
                android:id="@+id/tv_user_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                android:ellipsize="end"
                android:maxLines="1"
                android:textAppearance="@style/TextAppearance.AppCompat.Caption"
                tools:text="用户名"/>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical">

                <ImageView
                    android:id="@+id/iv_like"
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:layout_centerVertical="true"
                    android:layout_marginEnd="4dp"
                    android:layout_marginRight="4dp"
                    android:layout_toLeftOf="@+id/tv_like_count"
                    android:layout_toStartOf="@+id/tv_like_count"
                    app:srcCompat="@drawable/ic_like_gray_24dp"
                    tools:ignore="ContentDescription"/>

                <TextView
                    android:id="@+id/tv_like_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    tools:text="22"/>

            </RelativeLayout>
        </LinearLayout>

        <TextView
            android:id="@+id/tv_abstract"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:ellipsize="end"
            android:maxLines="6"
            tools:text="我去过印度,觉得印度人有时也太可爱了,在他们眼里,印度几乎就是唯一的,他们接受新事物的能力似乎非常的有限。但真心是想不到,印度居然还是IT大国。去过印度的人通常都会从导游那里知道:从新德里出发到阿格拉的泰姬陵之间的一趟列车,时速最高的时候达到了160公里/每小时,被印度人称为当地最快的火车。因为印度人非常的热情,看到中国游客就会用蹩脚的汉语跟中国人搭讪,甚至会问:“中国有没有这样快的火车呀?”,这让人尴尬不已,不知道如何回答是好。我在想如下回答,如何?----对不起,中国没有时速160的火车,只有时速360的动车。----我们中国的火车坐的人少,拉轻,印度的火车超载了,跑不快,所以中国的火车要快一点。----你们印度人是坐在车外面的,所以感觉很快,我们的高铁是坐里面的,所以感觉不到快。"/>

    </LinearLayout>

    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_below="@+id/content"
        android:background="@color/line_divider"/>

</RelativeLayout>

  预览效果:

  

6.API请求IMobileWendaApi

6.1.获取头条问答优质回答 

/**
     * 获取头条问答优质回答
     * http://is.snssdk.com/wenda/v1/question/brow/?iid=10344168417&device_id=36394312781
     *
     * @param qid 问答ID
     */
    @POST("http://is.snssdk.com/wenda/v1/question/brow/?iid=10344168417&device_id=36394312781")
    @FormUrlEncoded
    Observable<WendaContentBean> getWendaNiceContent(@Field("qid") String qid);

  传进来一个问答Id。

  传出去Observable<WendaContentBean>。

6.2.获取头条问答优质回答的加载更多

/**
     * 获取头条问答优质回答(加载更多)
     * http://is.snssdk.com/wenda/v1/question/loadmore/?iid=10344168417&device_id=36394312781
     *
     * @param qid    问答ID
     * @param offset 偏移量
     */
    @POST("http://is.snssdk.com/wenda/v1/question/loadmore/?iid=10344168417&device_id=36394312781")
    @FormUrlEncoded
    Observable<WendaContentBean> getWendaNiceContentLoadMore(
            @Field("qid") String qid,
            @Field("offset") int offset);

  传进来一个问答Id,一个偏移量。

  传出去一个Observable<WendaContentBean>。

6.3.获取头条问答普通回答

/**
     * 获取头条问答普通回答
     * http://is.snssdk.com/wenda/v1/questionother/brow/?iid=10344168417&device_id=36394312781
     *
     * @param qid 问答ID
     */
    @POST("http://is.snssdk.com/wenda/v1/questionother/brow/?iid=10344168417&device_id=36394312781")
    @FormUrlEncoded
    Observable<WendaContentBean> getWendaNormalContent(@Field("qid") String qid);

  传进来一个问答Id。

  传出去一个Observable<WendaContentBean>。

6.4.获取头条问答普通回答的加载更多

 /**
     * 获取头条问答普通回答(加载更多)
     * http://is.snssdk.com/wenda/v1/questionother/loadmore/?iid=10344168417&device_id=36394312781
     *
     * @param qid    问答ID
     * @param offset 偏移量
     */
    @POST("http://is.snssdk.com/wenda/v1/questionother/loadmore/?iid=10344168417&device_id=36394312781")
    @FormUrlEncoded
    Observable<WendaContentBean> getWendaNormalContentLoadMore(
            @Field("qid") String qid,
            @Field("offset") int offset);

  传进来一个问答Id,一个偏移量。

  传出去一个Observable<WendaContentBean>。

原文地址:https://www.cnblogs.com/Jason-Jan/p/8274992.html

时间: 2024-10-09 12:24:02

TouTiao开源项目 分析笔记19 问答内容的相关文章

TouTiao开源项目 分析笔记9 实现一个问答主页面

1.根据API返回创建几个基础的Bean 1.1.WendaArticleDataBean类 API返回的数据如下: /** * cell_type : 36 * extra : {"wenda_video":[],"show_answer":false,"video_large_card":false,"label_style":{"color_type":0,"name":"

TouTiao开源项目 分析笔记12 从总体到局部 构建视频主页面

1.构建视频主列表的整体碎片VideoTabLayout 1.1.首先创建一个VideoTabLayout package com.jasonjan.headnews.module.video; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Frag

TouTiao开源项目 分析笔记3

1.搭建NewsTabLayout片段 1.1.加载布局 @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_news_tab, container, false); initV

TouTiao开源项目 分析笔记4

1.一些示例文字 第一段 2.一些示例文字 第二段 3.一些示例文字 第三段 4.一些示例文字 第四段 5.一些示例文字 第五段 6.一些示例文字 第六段

TouTiao开源项目 分析笔记5

1.深入理解RxJava 1.1.基本上现在的APP都会有请求网络,然后处理回调的业务吧. 如果请求的数据很多,业务越来越复杂,怎么处理呢? 这里我用到了RxJava来帮我处理业务. RxJava主要复杂事件的通知和订阅.这个挺起来没有什么概念. 其实说白了,RxJava就是优雅地处理函数回调. 1.2.推荐参考文章:我们为什么要用rxjava? 这篇文章以一个案例的方式,详细解释了rxjava的功能. 下面我来深入分析一下. 1.3.以通常思维模式来处理这个案例. 这个比较好理解,但是这种方式

TouTiao开源项目 分析笔记7

1.一些示例文字 第一段 2.一些示例文字 第二段 3.一些示例文字 第三段 4.一些示例文字 第四段 5.一些示例文字 第五段 6.一些示例文字 第六段

今日头条开源项目 分析笔记1

1.InitApp==>项目的入口Application 1.1.继承了MultiDexApplication 超过65K方法的APP,会遇到65535的错误.原因就是为了支持比较大型的APP而产生. 参考文章:Android分包MultiDex原理详解. 1.2.在build.gradle中修改multiDexEnabled 然后记得在dependencies中加: implementation 'com.android.support:multidex:1.0.2' 1.3.用第三方库fac

.NET平台开源项目速览(19)Power BI神器DAX Studio

PowerBI更新频繁,已经有点更不上的节奏,一直在关注和学习中,基本的一些操作大概是没问题,更重要的是注重Power Query,M函数,以及DAX的使用,这才是核心.   上个月研究了DAX的一些语法和公式,发现这玩意看起来简单,但其实功能非常强大,所以就想和写代码一样,弄个工具试一下. 当然直接在Power BI Desktop中也可以完成,但总归感觉怪怪的,直到我发现了DAX Studio. 本来想直接下载来用一下,结果发现不是很容易玩,所以从头到尾把文档看了一遍,顺便总结下来. 如果不

树莓派开源项目开发笔记

2.led 没啥新的东西 就是GPIO操作 3.key 可以设置中断方式的来实现GPIO操作 wiringPiISR(gpio_num, rise/fall_edge, isr_server_addr) 4. gpio load i2c时候出现问题 gpio: Unable to load/unload modules as this Pi has the device tree enabled. You need to run the raspi-config program (as root