Skip to content

Commit

Permalink
修复新闻重复 bug (DiffUtil解决)
Browse files Browse the repository at this point in the history
  • Loading branch information
iMeiji committed Apr 18, 2017
1 parent c184733 commit d50d952
Show file tree
Hide file tree
Showing 17 changed files with 204 additions and 48 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@

## 更新日志
```
2017-4-18
修复新闻重复 bug (DiffUtil解决)
2017-4-15
添加头条号订阅
优化清除缓存
Expand Down Expand Up @@ -90,7 +93,6 @@ WebView无图模式(beta)
- 视频支持切换分辨率
- 本地新闻
- 订阅号要分类 新闻 / 图片 / 视频
- 刷新新闻有重复(bug, API问题)

## 许可证
```
Expand Down
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ android {
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.2"
versionName "1.2.2"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}
Expand Down
94 changes: 94 additions & 0 deletions app/src/main/java/com/meiji/toutiao/adapter/DiffCallback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.meiji.toutiao.adapter;

import android.support.v7.util.DiffUtil;

import com.meiji.toutiao.bean.media.MediaArticleBean;
import com.meiji.toutiao.bean.news.NewsArticleBean;
import com.meiji.toutiao.bean.news.joke.JokeContentBean;
import com.meiji.toutiao.bean.photo.PhotoArticleBean;
import com.meiji.toutiao.bean.video.VideoArticleBean;

import java.util.List;

/**
* Created by Meiji on 2017/4/18.
*/

public class DiffCallback extends DiffUtil.Callback {

public static final int NEW = 0;
public static final int JOKE = 1;
public static final int PHOTO = 2;
public static final int VIDEO = 3;
public static final int MEDIA = 4;
private List oldList, newList;
private int type;

public DiffCallback(List oldList, List newList, int type) {
this.oldList = oldList;
this.newList = newList;
this.type = type;
}

@Override
public int getOldListSize() {
return oldList != null ? oldList.size() : 0;
}

@Override
public int getNewListSize() {
return newList != null ? newList.size() : 0;
}

@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
try {
switch (type) {
case NEW:
return ((NewsArticleBean.DataBean) oldList.get(oldItemPosition)).getTitle().equals(
((NewsArticleBean.DataBean) newList.get(newItemPosition)).getTitle());
case JOKE:
return ((JokeContentBean.DataBean.GroupBean) oldList.get(oldItemPosition)).getContent().equals(
((JokeContentBean.DataBean.GroupBean) newList.get(newItemPosition)).getContent());
case PHOTO:
return ((PhotoArticleBean.DataBean) oldList.get(oldItemPosition)).getTitle().equals(
((PhotoArticleBean.DataBean) newList.get(newItemPosition)).getTitle());
case VIDEO:
return ((VideoArticleBean.DataBean) oldList.get(oldItemPosition)).getTitle().equals(
((VideoArticleBean.DataBean) newList.get(newItemPosition)).getTitle());
case MEDIA:
return ((MediaArticleBean.DataBean) oldList.get(oldItemPosition)).getTitle().equals(
((MediaArticleBean.DataBean) newList.get(newItemPosition)).getTitle());
}
} catch (NullPointerException e) {
e.printStackTrace();
}
return false;
}

@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
try {
switch (type) {
case NEW:
return ((NewsArticleBean.DataBean) oldList.get(oldItemPosition)).getShare_url().equals(
((NewsArticleBean.DataBean) newList.get(newItemPosition)).getShare_url());
case JOKE:
return ((JokeContentBean.DataBean.GroupBean) oldList.get(oldItemPosition)).getShare_url().equals(
((JokeContentBean.DataBean.GroupBean) newList.get(newItemPosition)).getShare_url());
case PHOTO:
return ((PhotoArticleBean.DataBean) oldList.get(oldItemPosition)).getSource_url().equals(
((PhotoArticleBean.DataBean) newList.get(newItemPosition)).getSource_url());
case VIDEO:
return ((VideoArticleBean.DataBean) oldList.get(oldItemPosition)).getShare_url().equals(
((VideoArticleBean.DataBean) newList.get(newItemPosition)).getShare_url());
case MEDIA:
return ((MediaArticleBean.DataBean) oldList.get(oldItemPosition)).getSource_url().equals(
((MediaArticleBean.DataBean) newList.get(newItemPosition)).getSource_url());
}
} catch (NullPointerException e) {
e.printStackTrace();
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.meiji.toutiao.utils.SettingsUtil;
import com.meiji.toutiao.utils.TimeUtil;

import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -31,9 +32,16 @@ public class MediaArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
private List<MediaArticleBean.DataBean> list;
private IOnItemClickListener onItemClickListener;

public MediaArticleAdapter(Context context, List<MediaArticleBean.DataBean> list) {
public MediaArticleAdapter(Context context) {
this.context = context;
this.list = list;
}

public List<MediaArticleBean.DataBean> getList() {
return list;
}

public void setList(List<MediaArticleBean.DataBean> list) {
this.list = new ArrayList<>(list);
}

public void setOnItemClickListener(IOnItemClickListener onItemClickListener) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,22 @@ public class NewsArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo

private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = 1;
private List<NewsArticleBean.DataBean> list = new ArrayList<>();
private List<NewsArticleBean.DataBean> list;
private IOnItemClickListener onItemClickListener;
private Context context;

public NewsArticleAdapter(Context context, List<NewsArticleBean.DataBean> list) {
this.list = list;
public NewsArticleAdapter(Context context) {
this.context = context;
}

public List<NewsArticleBean.DataBean> getList() {
return list;
}

public void setList(List<NewsArticleBean.DataBean> list) {
this.list = new ArrayList<>(list);
}

public void setOnItemClickListener(IOnItemClickListener listener) {
this.onItemClickListener = listener;
}
Expand Down Expand Up @@ -73,6 +80,8 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (image_list != null && image_list.size() != 0) {
String url = image_list.get(0).getUrl();
Glide.with(context).load(url).crossFade().centerCrop().error(R.mipmap.error_image).into(newsHolder.iv_image_url);
} else if (!TextUtils.isEmpty(bean.getMedia_avatar_url())) {
Glide.with(context).load(bean.getMedia_avatar_url()).crossFade().centerCrop().error(R.mipmap.error_image).into(newsHolder.iv_image_url);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,22 @@ public class JokeContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo

private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = 1;
private List<JokeContentBean.DataBean.GroupBean> list = new ArrayList();
private List<JokeContentBean.DataBean.GroupBean> list;
private Context context;
private IOnItemClickListener onItemClickListener;

public JokeContentAdapter(List list, Context context) {
this.list = list;
public JokeContentAdapter(Context context) {
this.context = context;
}

public List<JokeContentBean.DataBean.GroupBean> getList() {
return list;
}

public void setList(List<JokeContentBean.DataBean.GroupBean> list) {
this.list = new ArrayList<>(list);
}

public void setOnItemClickListener(IOnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,22 @@ public class PhotoArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewH

private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = 1;
private List<PhotoArticleBean.DataBean> list = new ArrayList();
private List<PhotoArticleBean.DataBean> list;
private Context context;
private IOnItemClickListener onItemClickListener;

public PhotoArticleAdapter(List list, Context context) {
this.list = list;
public PhotoArticleAdapter(Context context) {
this.context = context;
}

public List<PhotoArticleBean.DataBean> getList() {
return list;
}

public void setList(List<PhotoArticleBean.DataBean> list) {
this.list = new ArrayList<>(list);
}

public void setOnItemClickListener(IOnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,22 @@ public class VideoArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewH

private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = 1;
private List<VideoArticleBean.DataBean> list = new ArrayList<>();
private List<VideoArticleBean.DataBean> list;
private IOnItemClickListener onItemClickListener;
private Context context;

public VideoArticleAdapter(Context context, List<VideoArticleBean.DataBean> list) {
this.list = list;
public VideoArticleAdapter(Context context) {
this.context = context;
}

public List<VideoArticleBean.DataBean> getList() {
return list;
}

public void setList(List<VideoArticleBean.DataBean> list) {
this.list = new ArrayList<>(list);
}

public void setOnItemClickListener(IOnItemClickListener listener) {
this.onItemClickListener = listener;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
Expand All @@ -24,6 +25,7 @@

import com.bumptech.glide.Glide;
import com.meiji.toutiao.R;
import com.meiji.toutiao.adapter.DiffCallback;
import com.meiji.toutiao.adapter.media.MediaArticleAdapter;
import com.meiji.toutiao.bean.media.MediaArticleBean;
import com.meiji.toutiao.bean.media.MediaChannelBean;
Expand Down Expand Up @@ -123,7 +125,8 @@ public void onRequestData() {
@Override
public void onSetAdapter(final List<MediaArticleBean.DataBean> list) {
if (adapter == null) {
adapter = new MediaArticleAdapter(getActivity(), list);
adapter = new MediaArticleAdapter(getActivity());
adapter.setList(list);
recycler_view.setAdapter(adapter);
adapter.setOnItemClickListener(new IOnItemClickListener() {
@Override
Expand All @@ -132,7 +135,11 @@ public void onClick(View view, int position) {
}
});
} else {
adapter.notifyItemInserted(list.size());
// adapter.notifyItemInserted(list.size());
List<MediaArticleBean.DataBean> oldList = adapter.getList();
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffCallback(oldList, list, DiffCallback.MEDIA), true);
result.dispatchUpdatesTo(adapter);
adapter.setList(list);
}

canLoading = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ public List<NewsArticleBean.DataBean> getDataList() {
}
}
resultList.addAll(dataList);
// resultList = removeDuplicate(resultList);
return resultList;
}

Expand All @@ -90,18 +89,4 @@ public int getMaxBehotTime() {
}
return max_behot_time;
}

/**
* 移除重复数据
*/
private List<NewsArticleBean.DataBean> removeDuplicate(List<NewsArticleBean.DataBean> list) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
if (list.get(j).getTitle().equals(list.get(i).getTitle())) {
list.remove(j);
}
}
}
return list;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.meiji.toutiao.R;
import com.meiji.toutiao.adapter.DiffCallback;
import com.meiji.toutiao.adapter.news.NewsArticleAdapter;
import com.meiji.toutiao.bean.news.NewsArticleBean;
import com.meiji.toutiao.interfaces.IOnItemClickListener;
Expand Down Expand Up @@ -95,7 +97,8 @@ public void onRequestData() {
@Override
public void onSetAdapter(final List<NewsArticleBean.DataBean> list) {
if (adapter == null) {
adapter = new NewsArticleAdapter(getActivity(), list);
adapter = new NewsArticleAdapter(getActivity());
adapter.setList(list);
recycler_view.setAdapter(adapter);
adapter.setOnItemClickListener(new IOnItemClickListener() {
@Override
Expand All @@ -104,7 +107,11 @@ public void onClick(View view, int position) {
}
});
} else {
adapter.notifyItemInserted(list.size());
// adapter.notifyItemInserted(list.size());
List<NewsArticleBean.DataBean> oldList = adapter.getList();
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffCallback(oldList, list, DiffCallback.NEW), true);
result.dispatchUpdatesTo(adapter);
adapter.setList(list);
}

canLoading = true;
Expand Down
Loading

0 comments on commit d50d952

Please sign in to comment.