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>。

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

  1. TouTiao开源项目 分析笔记20 问答详情

    1.效果预览 1.1.效果预览,从问答列表开始 前面实现了从列表到内容. 这里主要讲解从内容到详情. 点击每一个回答内容,进入回答详情页面. 1.2.触发的点击事件 在WendaContentView ...

  2. TouTiao开源项目 分析笔记2

    1.Constant常量定义类 1.1.源代码 public class Constant { public static final String USER_AGENT_MOBILE = " ...

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

    1.根据API返回创建几个基础的Bean 1.1.WendaArticleDataBean类 API返回的数据如下: /** * cell_type : 36 * extra : {"wen ...

  4. TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现

    1.预览效果 1.1.首先看一下需要实现的效果. 第一种,文字类型新闻. 第二种,图片类型新闻. 1.2.在NewsArticleTextViewBinder中设置了点击事件 RxView.click ...

  5. TouTiao开源项目 分析笔记10 实现通用普通文章片段页面

    1.RxJava的Observable数据操作符总结 1.1.Map操作符 Map操作符对原始Observable发射的没一项数据应用一个你选择的函数, 然后返回一个发射这些结果的Observable ...

  6. TouTiao开源项目 分析笔记6

    1.NewsChannelBean简单类笔记 1.1.Comparable接口的实现和使用 参考文章:Comparable接口的实现和使用. 因为NewsChannelBean实现了Comparabl ...

  7. TouTiao开源项目 分析笔记17 新闻媒体专栏

    1.效果预览 1.1.要实现的效果 1.2.如何调转到新闻媒体专栏 点击右上角的用户图标. 在新闻详情页面的Fragment的菜单点击事件中触发. case R.id.action_open_medi ...

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

    1.构建视频主列表的整体碎片VideoTabLayout 1.1.首先创建一个VideoTabLayout package com.jasonjan.headnews.module.video; im ...

  9. TouTiao开源项目 分析笔记4==>一个简单APP 整体常用框架

    1.效果预览 1.1.如下图所以,到目前为止所有的功能. 2.从InitApp开始->SplashActivity->MainActivity 2.1.InitApp源代码.这是整个项目的 ...

随机推荐

  1. u-boot分析(六)----时钟初始化

    u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1.       ...

  2. Azure:陪伴你们,是我最长情的告白

    立即访问http://market.azure.cn

  3. Spring Cloud入门程序——注册服务提供者

    1.创建Spring Starter project 2.引入依赖 点击finish 3.创建启动类 package com.hello; import org.springframework.boo ...

  4. IOS 运行循环

    . 运行循环========================================在iOS的应用程序中,应用程序启动之后,系统即会创建一个运行循环监听用户的交互. 以下代码其本质是在运行循环 ...

  5. E. New Reform_贪心,深搜,广搜。

    E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 2017.9.16 Web 应用开发环境搭建与开发工具安装

    1.JDK的下载与安装 1.1 在网址:http://javase/downloads/index.jsp网站下载最新的JDK版本 1.2 安装jdk,双击下载好的.exe文件运行,一般默认安装在c盘 ...

  7. AngularJS 外部文件中的控制器其他实例

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  8. 分布式系统session一致性问题

    一.引言 1.什么是session Session 是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理.最常见的,会把用户的登录信息.用户信息存储在 session 中,以保持登录状态. ...

  9. SpringBoot学习8:springboot整合freemarker

    1.创建maven项目,添加pom依赖 <!--springboot项目依赖的父项目--> <parent> <groupId>org.springframewor ...

  10. java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量

    package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...