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. 【Node.js】一个愚蠢的Try Catch过错

    前段时间学习<深入浅出Nodejs>时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述"尝试对异步方法进行try/catch操作只能捕获当次事件循 ...

  2. centos6.5_64bit-kvm安装部署

    kvm部署安装   目录 kvm部署安装... 1 一.kvm部署... 1 1.关闭selinux和防火墙... 1 2.查看主机是否支持虚拟化... 1 3.安装kvm和其他虚拟化软件包... 1 ...

  3. VOS3000设置落地网关优先级

    问题描述: 现在有两种套餐卡A:无限通话B:每月3000分钟两个落地网关:GW100:32线用的A套餐GW101:32线用的B套餐 比如现在是12月5号还没到月底,突然发现GW101上所剩可用通话时间 ...

  4. C#获取农历的日期(转)

    //C# 获取农历日期 ///<summary> /// 实例化一个 ChineseLunisolarCalendar ///</summary> private static ...

  5. Android程序员不容错过的10款在线实用工具

    Android十款在线工具,在做Android开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了.Android在线工具,包括在线测试工具,及其他较为重 ...

  6. 859. Buddy Strings (wrong 4 times so many cases to test and consider) if else**

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters i ...

  7. 前端高质量知识(一)-JS内存空间详细图解

    变量对象与堆内存   var a = 20;   var b = 'abc';   var c = true;   var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所 ...

  8. Linux高性能server编程——定时器

    版权声明:本文为博主原创文章.未经博主允许不得转载. https://blog.csdn.net/walkerkalr/article/details/36869913  定时器 服务器程序通常管 ...

  9. 【BZOJ4555】[TJOI2016&HEOI2016] 求和(NTT)

    点此看题面 大致题意: 计算\(\sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*(j!)\),其中\(S\)为第二类斯特林数. 推式子 首先让我们来推一波式子: 因为当\(i&l ...

  10. 关于VMware给系统分区扩容的一点经验

    我的VMware版本是8.0.6 build-1035888,里面安装的是Windows XP SP3 首先,在VM关机状态下使用Hard disk设置中的Utilities下的Expand给整个磁盘 ...