今日总结
结果:完成活动列表页
发现问题:
- 当切换到其他fragment再切回时,会重新请求适配,有较长的延时。
- 当多次快速切换fragment再切回时,多次请求结果会叠加,造成列表元素重复。
先实现,再修改,问题暂且不管。
准备
- mainfest添加互联网权限(又忘了。。)
<uses-permission android:name="android.permission.INTERNET"/>
- 准备好一些依赖
implementation 'io.reactivex:rxandroid:1.1.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.42'
implementation 'com.squareup.picasso:picasso:2.5.2'
使用的接口上学期自己写的,应该也都是在本地搭建环境,
ip记得别用127或localhost,使用内网地址
例:
cmd->ipconfig 即使用 172.19.183.244
PPP 适配器 NDR: 连接特定的 DNS 后缀 . . . . . . . : IPv6 地址 . . . . . . . . . . . . : 2001:da8:a807:203:4c00:46e9:8f2c:61d1 本地链接 IPv6 地址. . . . . . . . : fe80::4c00:46e9:8f2c:61d1%70 IPv4 地址 . . . . . . . . . . . . : 172.19.183.244 子网掩码 . . . . . . . . . . . . : 255.255.255.255 默认网关. . . . . . . . . . . . . : fe80::220b:c7ff:fe8f:218d%70 0.0.0.0
MVP
项目是采用MVP的思想来降低耦合,虽然只是学个形似。
由于此博客只是记录一下自己的项目过程,就不详细说明了。
项目结构:
扫描二维码关注公众号,回复:
3238889 查看本文章
契约类
contract是契约类,mvp需实现的的方法都会在里面定义
public interface ActivityListContract {
interface Model {
void getAllActivityData(Subscriber<List<ActivityBean>> subscriber);
}
interface View {
void updateAdapterData(List<ActivityBean> data);
}
interface Presenter {
void updateAdapterData();
}
}
M层
model下存放实体Bean 和获取数据的Model类
ActivityBean.java
public class ActivityBean {
/**
* activityid : 3
* startdate : 2018-09-07 12:34:30
* enddate : 2018-09-07 12:34:30
* pirce : 21312
* pernem : 21312
* intro : 2121
* addres : null
* adminid : 1
* activityname : 12312
* activitypic : 5b91ffd6d1e72.jpg
*/
private int activityid;
private String startdate;
private String enddate;
private int pirce;
private int pernem;
private String intro;
private Object addres;
private int adminid;
private String activityname;
private String activitypic;
public int getActivityid() {
return activityid;
}
public void setActivityid(int activityid) {
this.activityid = activityid;
}
public String getStartdate() {
return startdate;
}
public void setStartdate(String startdate) {
this.startdate = startdate;
}
public String getEnddate() {
return enddate;
}
public void setEnddate(String enddate) {
this.enddate = enddate;
}
public int getPirce() {
return pirce;
}
public void setPirce(int pirce) {
this.pirce = pirce;
}
public int getPernem() {
return pernem;
}
public void setPernem(int pernem) {
this.pernem = pernem;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public Object getAddres() {
return addres;
}
public void setAddres(Object addres) {
this.addres = addres;
}
public int getAdminid() {
return adminid;
}
public void setAdminid(int adminid) {
this.adminid = adminid;
}
public String getActivityname() {
return activityname;
}
public void setActivityname(String activityname) {
this.activityname = activityname;
}
public String getActivitypic() {
return activitypic;
}
public void setActivitypic(String activitypic) {
this.activitypic = activitypic;
}
}
ActivityListModel.java
public class ActivityListModel implements ActivityListContract.Model {
@Override
public void getAllActivityData(Subscriber<List<ActivityBean>> subscriber) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
RetrofitHttp.getRetrofit(builder).getAllActivity()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
V层
View即activity或fragment,我没有将它们放入mvp目录,而是和adapter适配器放入ui目录。
adapter使用了第三方的BRVAH,可以节省大量代码。
public class ActivityListAdapter extends BaseQuickAdapter<ActivityBean, BaseViewHolder {
private Context context;
//传入xml资源id和context上下文进行适配,这个函数会在View层(Fragment)调用。
public ActivityListAdapter(int layoutResId, Context context) {
super(layoutResId);
this.context = context;
}
@Override
protected void convert(BaseViewHolder helper, ActivityBean item) {
helper.setText(R.id.item_name,item.getActivityname())
.setText(R.id.item_intro,String.valueOf(item.getIntro()))
.setText(R.id.item_date,item.getStartdate());
Picasso.with(context).load(item.getPirce()).into((ImageView) helper.getView(R.id.item_pic));
}
}
wiget/MyItemDecoration.java
//MyItemDecoration 底边间隔
public class MyItemDecoration extends RecyclerView.ItemDecoration {
/**
*
* @param outRect 边界
* @param view recyclerView ItemView
* @param parent recyclerView
* @param state recycler 内部数据管理
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//设定底部边距为1px
outRect.set(0, 0, 0, 2);
}
}
ActivityFragment.java
V层会调用P层的方法来获取数据。
public class ActivityFragment extends Fragment implements ActivityListContract.View {
@BindView(R.id.activity_list)
RecyclerView activityList;
Unbinder unbinder;
private ActivityListAdapter adapter;
private ActivityListPresenter presenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_activity, container, false);
unbinder = ButterKnife.bind(this, view);
//创建布局管理
final RecyclerView recyclerView = view.findViewById(R.id.activity_list);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
//ItemDecoration即item之间的空隙
recyclerView.addItemDecoration(new MyItemDecoration());
//创建适配器
adapter =new ActivityListAdapter(R.layout.item_list,getContext());
//presenter传入当前view。并调用P层方法获取数据
presenter = new ActivityListPresenter(this);
presenter.updateAdapterData();
//给RecyclerView设置适配器
recyclerView.setAdapter(adapter);
return view;
}
public static ActivityFragment newInstance(String name) {
ActivityFragment fragment = new ActivityFragment();
Bundle args = new Bundle();
args.putString("name", name);
fragment.setArguments(args);
return fragment;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void updateAdapterData(List<ActivityBean> data) {
adapter.addData(data);
}
}
P层
M层和V层的交互的具体实现在这里。
public class ActivityListPresenter implements ActivityListContract.Presenter {
private ActivityListContract.View view;
private ActivityListContract.Model model;
//构造函数来获取是哪个View
public ActivityListPresenter(ActivityListContract.View view) {
this.view = view;
model = new ActivityListModel();
}
@Override
public void updateAdapterData() {
model.getAllActivityData(new Subscriber<List<ActivityBean>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onNext: "+"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onNext: "+e.toString());
}
@Override
public void onNext(List<ActivityBean> activityBeans) {
view.updateAdapterData(activityBeans);
Log.d(TAG, "onNext: "+activityBeans.get(0).getActivityname());
}
});
}
}
先这么写,有空在完善。