1.要达到的效果

1.1.主要效果图

  

  点击了标题栏的消息图标后,然后会跳转到评论详情的页面。

1.2.触发的点击事件

  在新闻详情的片段中的菜单点击事件中

  设置上方标题栏的消息标的监听事件

  1. case R.id.action_open_comment:
  2. NewsCommentActivity.launch(bean.getGroup_id() + "", bean.getItem_id() + "");
  3. break;

  bean就是某一个新闻的一些属性,从最前面item中传递过来的。

2.新闻评论详情活动

2.1.源代码

  1. class NewsCommentActivity : BaseActivity() {
  2.  
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.container)
  6. val intent = intent
  7. supportFragmentManager.beginTransaction()
  8. .replace(R.id.container,
  9. NewsCommentFragment.newInstance(intent.getStringExtra(ARG_GROUPID), intent.getStringExtra(ARG_ITEMID)))
  10. .commit()
  11. }
  12.  
  13. companion object {
  14.  
  15. private val TAG = "NewsCommentActivity"
  16. private val ARG_GROUPID = "groupId"
  17. private val ARG_ITEMID = "itemId"
  18.  
  19. fun launch(groupId: String, itemId: String) {
  20. InitApp.AppContext.startActivity(Intent(InitApp.AppContext, NewsCommentActivity::class.java)
  21. .putExtra(ARG_GROUPID, groupId)
  22. .putExtra(ARG_ITEMID, itemId)
  23. .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
  24. }
  25. }
  26. }

2.2.外部启动这个评论活动的一个静态launch函数。

  这里需要将两个关键的参数保存起来,之后在评论中会用到。  

2.3.然后是一个onCreate函数,这个活动优先执行。

  将container替换成片段的布局。

2.4.在清单中配置这个活动 

  1. <activity
  2. android:name=".module.news.comment.NewsCommentActivity"
  3. android:configChanges="orientation|screenSize|uiMode"
  4. android:label="@string/title_comment"
  5. android:theme="@style/AppTheme.NoActionBar.Slidable"/>

3.新闻评论的片段

3.1.底层接口==>INewsComment

  1. public interface INewsComment {
  2.  
  3. interface View extends IBaseListView<Presenter> {
  4.  
  5. /**
  6. * 请求数据
  7. */
  8. void onLoadData();
  9. }
  10.  
  11. interface Presenter extends IBasePresenter {
  12.  
  13. /**
  14. * 请求数据
  15. */
  16. void doLoadData(String... groupId_ItemId);
  17.  
  18. /**
  19. * 再起请求数据
  20. */
  21. void doLoadMoreData();
  22.  
  23. /**
  24. * 设置适配器
  25. */
  26. void doSetAdapter(List<NewsCommentBean.DataBean.CommentBean> list);
  27.  
  28. /**
  29. * 加载完毕
  30. */
  31. void doShowNoMore();
  32. }
  33. }

3.2.新闻评论片段源代码  

  1. public class NewsCommentFragment extends BaseListFragment<INewsComment.Presenter> implements INewsComment.View{
  2. private static final String GROUP_ID = "groupId";
  3. private static final String ITEM_ID = "itemId";
  4. private static final String TAG = "NewsCommentFragment";
  5. private String groupId;
  6. private String itemId;
  7.  
  8. public static NewsCommentFragment newInstance(String groupId, String itemId) {
  9. NewsCommentFragment instance = new NewsCommentFragment();
  10. Bundle bundle = new Bundle();
  11. bundle.putString(GROUP_ID, groupId);
  12. bundle.putString(ITEM_ID, itemId);
  13. instance.setArguments(bundle);
  14. return instance;
  15. }
  16.  
  17. @Override
  18. protected int attachLayoutId() {
  19. return R.layout.fragment_list_toolbar;
  20. }
  21.  
  22. @Override
  23. protected void initData() {
  24. Bundle arguments = getArguments();
  25. groupId = arguments.getString(GROUP_ID);
  26. itemId = arguments.getString(ITEM_ID);
  27. onLoadData();
  28. }
  29.  
  30. @Override
  31. public void onLoadData() {
  32. onShowLoading();
  33. presenter.doLoadData(groupId, itemId);
  34. }
  35.  
  36. @Override
  37. public void onRefresh() {
  38. presenter.doRefresh();
  39. }
  40.  
  41. @Override
  42. protected void initView(View view) {
  43. super.initView(view);
  44. Toolbar toolbar = view.findViewById(R.id.toolbar);
  45. initToolBar(toolbar, true, getString(R.string.title_comment));
  46. toolbar.setOnClickListener(new View.OnClickListener() {
  47. @Override
  48. public void onClick(View view) {
  49. recyclerView.smoothScrollToPosition(0);
  50. }
  51. });
  52. toolbar.setBackgroundColor(SettingUtil.getInstance().getColor());
  53.  
  54. adapter = new MultiTypeAdapter(oldItems);
  55. Register.registerNewsCommentItem(adapter);
  56. recyclerView.setAdapter(adapter);
  57. recyclerView.addOnScrollListener(new OnLoadMoreListener() {
  58. @Override
  59. public void onLoadMore() {
  60. if (canLoadMore) {
  61. canLoadMore = false;
  62. presenter.doLoadMoreData();
  63. }
  64. }
  65. });
  66. setHasOptionsMenu(true);
  67. }
  68.  
  69. @Override
  70. public void onSetAdapter(final List<?> list) {
  71. Items newItems = new Items(list);
  72. newItems.add(new LoadingBean());
  73. DiffCallback.notifyDataSetChanged(oldItems, newItems, DiffCallback.NEWS_COMMENT, adapter);
  74. oldItems.clear();
  75. oldItems.addAll(newItems);
  76. canLoadMore = true;
  77. }
  78.  
  79. @Override
  80. public void setPresenter(INewsComment.Presenter presenter) {
  81. if (null == presenter) {
  82. this.presenter = new NewsCommentPresenter(this);
  83. }
  84. }
  85.  
  86. @Override
  87. public void fetchData() {
  88.  
  89. }
  90. }

3.3.新建一个实例,供外部调用。

  传进来两个参数,一个groupId,一个itemId。

  传出去一个片段Fragment。

3.4.重写返回片段的布局==>fragment_list_toolbar.xml。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.design.widget.CoordinatorLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="@color/windowBackground"
  8. android:fitsSystemWindows="true"
  9. android:orientation="vertical">
  10.  
  11. <include layout="@layout/toolbar"/>
  12.  
  13. <android.support.v4.widget.SwipeRefreshLayout
  14. android:id="@+id/refresh_layout"
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. app:layout_behavior="@string/appbar_scrolling_view_behavior">
  18.  
  19. <android.support.v7.widget.RecyclerView
  20. android:id="@+id/recycler_view"
  21. android:layout_width="match_parent"
  22. android:layout_height="match_parent"
  23. android:fadeScrollbars="true"
  24. android:scrollbarFadeDuration="1"
  25. android:scrollbars="vertical"
  26. app:layoutManager="LinearLayoutManager">
  27. </android.support.v7.widget.RecyclerView>
  28.  
  29. </android.support.v4.widget.SwipeRefreshLayout>
  30.  
  31. </android.support.design.widget.CoordinatorLayout>

  预览页面:

  

3.5.初始化视图initView。

  传进去一个view。

  获取toolbar+点击事件。

  新建一个adapter,给recycleView设置适配器+滑动监听事件。

  设置菜单。

3.6.初始化数据initData。

  获取存放在bundle中的两个信息。

  然后调用处理器来加载数据。

3.7.重写onRefresh函数。

  调用处理器的刷新。

3.8.重写加载函数onLoadData。

  显示视图的加载圈。

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

3.9.重写设置适配器。

  传入一个List。

  比较新老数据,动态变化数据。

3.10.重写设置处理器。

  传入一个底层接口中定义的一个处理器。

  将这个处理器保存起来以后用。

  

3.11.重写填充数据的fetchData。

  里面是空的。这里不做任何事情。  

4.新闻评论的处理器

4.1.源代码 

  1. package com.jasonjan.headnews.module.news.comment;
  2.  
  3. import com.jasonjan.headnews.api.IMobileNewsApi;
  4. import com.jasonjan.headnews.bean.news.NewsCommentBean;
  5. import com.jasonjan.headnews.main.ErrorAction;
  6. import com.jasonjan.headnews.main.RetrofitFactory;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.List;
  10.  
  11. import io.reactivex.android.schedulers.AndroidSchedulers;
  12. import io.reactivex.annotations.NonNull;
  13. import io.reactivex.functions.Consumer;
  14. import io.reactivex.functions.Function;
  15. import io.reactivex.schedulers.Schedulers;
  16.  
  17. /**
  18. * Created by JasonJan on 2018/1/9.
  19. */
  20.  
  21. public class NewsCommentPresenter implements INewsComment.Presenter{
  22. private static final String TAG = "NewsCommentPresenter";
  23. private INewsComment.View view;
  24. private String groupId;
  25. private String itemId;
  26. private int offset = 0;
  27. private List<NewsCommentBean.DataBean.CommentBean> commentsBeanList = new ArrayList<>();
  28.  
  29. public NewsCommentPresenter(INewsComment.View view) {
  30. this.view = view;
  31. }
  32.  
  33. @Override
  34. public void doLoadData(String... groupId_ItemId){
  35. try {
  36. if (null == this.groupId) {
  37. this.groupId = groupId_ItemId[0];
  38. }
  39. if (null == this.itemId) {
  40. this.itemId = groupId_ItemId[1];
  41. }
  42. } catch (Exception e) {
  43. ErrorAction.print(e);
  44. }
  45.  
  46. RetrofitFactory.getRetrofit().create(IMobileNewsApi.class)
  47. .getNewsComment(groupId, offset)
  48. .subscribeOn(Schedulers.io())
  49. .map(new Function<NewsCommentBean, List<NewsCommentBean.DataBean.CommentBean>>() {
  50. @Override
  51. public List<NewsCommentBean.DataBean.CommentBean> apply(@NonNull NewsCommentBean newsCommentBean) throws Exception {
  52. List<NewsCommentBean.DataBean.CommentBean> data = new ArrayList<>();
  53. for (NewsCommentBean.DataBean bean : newsCommentBean.getData()) {
  54. data.add(bean.getComment());
  55. }
  56. return data;
  57. }
  58. })
  59. .compose(view.<List<NewsCommentBean.DataBean.CommentBean>>bindToLife())
  60. .observeOn(AndroidSchedulers.mainThread())
  61. .subscribe(new Consumer<List<NewsCommentBean.DataBean.CommentBean>>() {
  62. @Override
  63. public void accept(@NonNull List<NewsCommentBean.DataBean.CommentBean> list) throws Exception {
  64. if (null != list && list.size() > 0) {
  65. doSetAdapter(list);
  66. } else {
  67. doShowNoMore();
  68. }
  69. }
  70. }, new Consumer<Throwable>() {
  71. @Override
  72. public void accept(@NonNull Throwable throwable) throws Exception {
  73. doShowNetError();
  74. ErrorAction.print(throwable);
  75. }
  76. });
  77. }
  78.  
  79. @Override
  80. public void doLoadMoreData() {
  81. offset += 20;
  82. doLoadData();
  83. }
  84.  
  85. @Override
  86. public void doSetAdapter(List<NewsCommentBean.DataBean.CommentBean> list) {
  87. commentsBeanList.addAll(list);
  88. view.onSetAdapter(commentsBeanList);
  89. view.onHideLoading();
  90. }
  91.  
  92. @Override
  93. public void doRefresh() {
  94. if (commentsBeanList.size() != 0) {
  95. commentsBeanList.clear();
  96. offset = 0;
  97. }
  98. doLoadData();
  99. }
  100.  
  101. @Override
  102. public void doShowNetError() {
  103. view.onHideLoading();
  104. view.onShowNetError();
  105. }
  106.  
  107. @Override
  108. public void doShowNoMore() {
  109. view.onHideLoading();
  110. view.onShowNoMore();
  111. }
  112. }

4.2.一个构造函数。

  传进去一个底层接口中定义的一个View。

  保存这个View,以后再用。

4.3.重写doLoadData函数。

  传进去一个String...类型,类似于数组。

  然后调用API请求。

4.4.重写加载更多doLoadMoreData函数。

  偏移量增加20即可。

  然后再调用doLoadData函数。

4.5.重写设置适配器doSetAdapter函数。

  传进去一个List。

  然后调用视图层的onSetAdapter函数。

  然后调用试图层的onHideLoading函数。

4.6.重写刷新。

  将List清空,设置偏移量为0。

  然后调用doLoadData。

4.7.重写网络错误。  

  调用视图层的隐藏加载函数。

  调用视图层的显示网络错误。

4.8.重写没有更多。

  调用视图层的隐藏加载函数。

  调用视图层的显示没有更多函数。

5.注册数据类型

5.1.首先在新闻评论片段中给适配器添加数据类型 

  1. adapter = new MultiTypeAdapter(oldItems);
  2. Register.registerNewsCommentItem(adapter);
  3. recyclerView.setAdapter(adapter);

 

5.2.然后在自定义类Register统一注册这个页面需要的类型 

  1. public static void registerNewsCommentItem(@NonNull MultiTypeAdapter adapter) {
  2. adapter.register(NewsCommentBean.DataBean.CommentBean.class, new NewsCommentViewBinder());
  3. adapter.register(LoadingBean.class, new LoadingViewBinder());
  4. adapter.register(LoadingEndBean.class, new LoadingEndViewBinder());
  5. }

  

5.3.然后看一下这个新闻评论的视图绑定类==>NewsCommentViewBinder

  1. package com.jasonjan.headnews.binder.news;
  2.  
  3. import android.content.ClipData;
  4. import android.content.ClipboardManager;
  5. import android.content.Context;
  6. import android.support.annotation.NonNull;
  7. import android.support.design.widget.Snackbar;
  8. import android.support.v7.widget.RecyclerView;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.ImageView;
  13. import android.widget.TextView;
  14.  
  15. import com.jasonjan.headnews.R;
  16. import com.jasonjan.headnews.bean.news.NewsCommentBean;
  17. import com.jasonjan.headnews.main.ErrorAction;
  18. import com.jasonjan.headnews.main.IntentAction;
  19. import com.jasonjan.headnews.module.base.BaseActivity;
  20. import com.jasonjan.headnews.util.ImageLoader;
  21. import com.jasonjan.headnews.widget.BottomSheetDialogFixed;
  22.  
  23. import me.drakeet.multitype.ItemViewBinder;
  24.  
  25. /**
  26. * Created by JasonJan on 2018/1/9.
  27. */
  28.  
  29. public class NewsCommentViewBinder extends ItemViewBinder<NewsCommentBean.DataBean.CommentBean,NewsCommentViewBinder.ViewHolder> {
  30.  
  31. @NonNull
  32. @Override
  33. protected NewsCommentViewBinder.ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
  34. View view = inflater.inflate(R.layout.item_news_comment, parent, false);
  35. return new ViewHolder(view);
  36. }
  37.  
  38. @Override
  39. protected void onBindViewHolder(@NonNull final ViewHolder holder, @NonNull final NewsCommentBean.DataBean.CommentBean item) {
  40.  
  41. final Context context = holder.itemView.getContext();
  42.  
  43. try {
  44. String iv_avatar = item.getUser_profile_image_url();
  45. String tv_username = item.getUser_name();
  46. String tv_text = item.getText();
  47. int tv_likes = item.getDigg_count();
  48.  
  49. ImageLoader.loadCenterCrop(context, iv_avatar, holder.iv_avatar, R.color.viewBackground);
  50. holder.tv_username.setText(tv_username);
  51. holder.tv_text.setText(tv_text);
  52. holder.tv_likes.setText(tv_likes + "赞");
  53. holder.itemView.setOnClickListener(new View.OnClickListener() {
  54. @Override
  55. public void onClick(View v) {
  56. final String content = item.getText();
  57. final BottomSheetDialogFixed dialog = new BottomSheetDialogFixed(context);
  58. dialog.setOwnerActivity((BaseActivity) context);
  59. View view = ((BaseActivity) context).getLayoutInflater().inflate(R.layout.item_comment_action_sheet, null);
  60. view.findViewById(R.id.layout_copy_text).setOnClickListener(new View.OnClickListener() {
  61. @Override
  62. public void onClick(View view) {
  63. ClipboardManager copy = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
  64. ClipData clipData = ClipData.newPlainText("text", content);
  65. copy.setPrimaryClip(clipData);
  66. Snackbar.make(holder.itemView, R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT).show();
  67. dialog.dismiss();
  68. }
  69. });
  70. view.findViewById(R.id.layout_share_text).setOnClickListener(new View.OnClickListener() {
  71. @Override
  72. public void onClick(View view) {
  73. IntentAction.send(context, content);
  74. dialog.dismiss();
  75. }
  76. });
  77. dialog.setContentView(view);
  78. dialog.show();
  79. }
  80. });
  81. } catch (Exception e) {
  82. ErrorAction.print(e);
  83. }
  84. }
  85.  
  86. public class ViewHolder extends RecyclerView.ViewHolder {
  87.  
  88. private ImageView iv_avatar;
  89. private TextView tv_username;
  90. private TextView tv_text;
  91. private TextView tv_likes;
  92.  
  93. public ViewHolder(View itemView) {
  94. super(itemView);
  95. this.iv_avatar = itemView.findViewById(R.id.iv_avatar);
  96. this.tv_username = itemView.findViewById(R.id.tv_username);
  97. this.tv_text = itemView.findViewById(R.id.tv_text);
  98. this.tv_likes = itemView.findViewById(R.id.tv_likes);
  99. }
  100. }
  101. }

 

5.4.需要一个新闻评论每一个item的布局==>item_news_comment.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:background="@color/viewBackground">
  8.  
  9. <LinearLayout
  10. android:id="@+id/content"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:background="?attr/selectableItemBackground"
  14. android:foreground="?attr/selectableItemBackground"
  15. android:orientation="vertical"
  16. android:paddingBottom="8dp"
  17. android:paddingLeft="16dp"
  18. android:paddingRight="16dp"
  19. android:paddingTop="8dp">
  20.  
  21. <LinearLayout
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:orientation="horizontal">
  25.  
  26. <com.meiji.toutiao.widget.CircleImageView
  27. android:id="@+id/iv_avatar"
  28. android:layout_width="22dp"
  29. android:layout_height="22dp"
  30. android:layout_gravity="center"/>
  31.  
  32. <TextView
  33. android:id="@+id/tv_username"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:layout_gravity="center"
  37. android:layout_marginLeft="8dp"
  38. android:layout_marginStart="8dp"
  39. android:ellipsize="end"
  40. android:maxLines="1"
  41. tools:text="小恢恢的帽子"/>
  42.  
  43. </LinearLayout>
  44.  
  45. <LinearLayout
  46. android:layout_width="match_parent"
  47. android:layout_height="wrap_content"
  48. android:layout_marginTop="4dp"
  49. android:orientation="vertical">
  50.  
  51. <TextView
  52. android:id="@+id/tv_text"
  53. android:layout_width="wrap_content"
  54. android:layout_height="wrap_content"
  55. tools:text="光看个开头就笑的不行了,咱们中国有个传统,就是家里来客人了,要到门口迎一下,如果手里还带着礼物,那要先接过来,因为人家大老远一路带过来的,已经很累了,更何况老美不远万里带过来的呢,如果不接过来那也太不像话了,会让国际笑话中国,也有失大国风范!这也是一种礼貌,更是中华民族的传统美德!"/>
  56.  
  57. <TextView
  58. android:id="@+id/tv_likes"
  59. android:layout_width="match_parent"
  60. android:layout_height="wrap_content"
  61. android:layout_marginTop="2dp"
  62. android:gravity="end"
  63. android:maxLines="1"
  64. tools:text="4832赞"/>
  65.  
  66. </LinearLayout>
  67. </LinearLayout>
  68.  
  69. <View
  70. android:id="@+id/divider"
  71. android:layout_width="match_parent"
  72. android:layout_height="1px"
  73. android:layout_below="@+id/content"
  74. android:background="@color/line_divider"/>
  75.  
  76. </RelativeLayout>

  预览页面:

  

6.API请求

6.1.在IMobieNewsApi中写这个函数

  1. /**
  2. * 获取新闻评论
  3. * 按热度排序
  4. * http://is.snssdk.com/article/v53/tab_comments/?group_id=6314103921648926977&offset=0&tab_index=0
  5. * 按时间排序
  6. * http://is.snssdk.com/article/v53/tab_comments/?group_id=6314103921648926977&offset=0&tab_index=1
  7. *
  8. * @param groupId 新闻ID
  9. * @param offset 偏移量
  10. */
  11. @GET("http://is.snssdk.com/article/v53/tab_comments/")
  12. Observable<NewsCommentBean> getNewsComment(
  13. @Query("group_id") String groupId,
  14. @Query("offset") int offset);

  传递进来两个参数,一个是新闻Id,一个是偏移量(就是获取那些评论)。

  传出去Observable<NewsCommentBean>

6.2.调用方式==>在处理器的加载数据中执行 

  1. RetrofitFactory.getRetrofit().create(IMobileNewsApi.class)
  2. .getNewsComment(groupId, offset)
  3. .subscribeOn(Schedulers.io())
  4. .map(new Function<NewsCommentBean, List<NewsCommentBean.DataBean.CommentBean>>() {
  5. @Override
  6. public List<NewsCommentBean.DataBean.CommentBean> apply(@NonNull NewsCommentBean newsCommentBean) throws Exception {
  7. List<NewsCommentBean.DataBean.CommentBean> data = new ArrayList<>();
  8. for (NewsCommentBean.DataBean bean : newsCommentBean.getData()) {
  9. data.add(bean.getComment());
  10. }
  11. return data;
  12. }
  13. })
  14. .compose(view.<List<NewsCommentBean.DataBean.CommentBean>>bindToLife())
  15. .observeOn(AndroidSchedulers.mainThread())
  16. .subscribe(new Consumer<List<NewsCommentBean.DataBean.CommentBean>>() {
  17. @Override
  18. public void accept(@NonNull List<NewsCommentBean.DataBean.CommentBean> list) throws Exception {
  19. if (null != list && list.size() > 0) {
  20. doSetAdapter(list);
  21. } else {
  22. doShowNoMore();
  23. }
  24. }
  25. }, new Consumer<Throwable>() {
  26. @Override
  27. public void accept(@NonNull Throwable throwable) throws Exception {
  28. doShowNetError();
  29. ErrorAction.print(throwable);
  30. }
  31. });
  32. }

TouTiao开源项目 分析笔记16 新闻评论的更多相关文章

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

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

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

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

  3. TouTiao开源项目 分析笔记14 段子评论

    1.段子页面详情 1.1.先看看预览界面吧 左边的页面已经实现了,现在的目的就是要实现点击左侧的每一个item 然后跳转到右边相应的段子详情页面. 1.2.首先肯定有右侧这个活动==>JokeC ...

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

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

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

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

  6. TouTiao开源项目 分析笔记18 视频详情页面

    1.效果预览 1.1.需要做到的真实效果 1.2.触发的点击事件 在MediaArticleVideoViewBinder的每一个item点击事件中: VideoContentActivity.lau ...

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

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

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

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

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

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

随机推荐

  1. sharepoint2007就地升级2010系列(二)环境概述及升级前准备

    环境介绍:1台2GB的虚机 现在是windows server 2008 sp2 X64 +SQL 2005+SQL2005 sp3+sharepoint2007+sharepoint2007SP2 ...

  2. Azure进阶攻略丨如何驾驭罢工的Linux虚机网卡?

    很多人的生活中,流传着一个屡试不爽,据说可以解决任何问题的百宝锦囊: 所以经常可以听到类似这样的对话: -我的电脑咋上不去网了? -重启一下电脑. -还是不行呢! -重启一下路由器. -怎么还不行-_ ...

  3. python3绘图示例2(基于matplotlib:柱状图、分布图、三角图等)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from matplotlib import pyplot as pltimport numpy as npim ...

  4. ALPS语言学校(西雅图)|ALPS Language School (Seattle)

    http://www.swliuxue.com/school-3879.html 所属国家: 美国 所在省洲: 华盛顿州 所在城市: 华盛顿州 建校时间: 1992年 学校类型: 院校 学校类别: 私 ...

  5. TP5.1:facade静态代理

    THINKPHP中有很多很多的facade静态代理,这些静态代理的位置在:thinkphp\think\facade文件夹下 1.在app\commom中新建一个文件,名为:Test.php,表示被代 ...

  6. C++指针、引用、const

    ; int *p = &a; //定义指针p指向变量a *p = ; //*p代表a的值 ; p = &b; //p指向变量b *p = ; //此时*p代表b的值 ] = {,,}; ...

  7. Django Field lookups (字段查找)

    字段查找是指定SQL WHERE子句的核心内容的方式. 它们被指定为QuerySet方法filter().exclude()和get()的关键字参数. 1.exact:精确查找.如果为比较提供的值为N ...

  8. IOS 设置定时器,执行方法

    //设置定时器(1秒后跳到一下题) [self performSelector:@selector(nextQuestion) withObject:nil afterDelay:1.0];

  9. 转:adb操作命令详解及大全

    说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android调试桥,身为 Android 开发的我们,熟练使用 ADB 命令将会大大提升我们的开发效率, ADB 的命令 ...

  10. CentOS安装配置MongoDB

    1.下载安装包: wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-2.0.3.tgz 2.解压: tar -zxvf mongodb-l ...