约健:day2

今日总结

结果:完成活动列表页

发现问题:

  1. 当切换到其他fragment再切回时,会重新请求适配,有较长的延时。
  2. 当多次快速切换fragment再切回时,多次请求结果会叠加,造成列表元素重复。

先实现,再修改,问题暂且不管。

准备

  1. mainfest添加互联网权限(又忘了。。)
<uses-permission android:name="android.permission.INTERNET"/>
  1. 准备好一些依赖
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'
  1. 使用的接口上学期自己写的,应该也都是在本地搭建环境,

    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());
            }
        });
    }
}

先这么写,有空在完善。

猜你喜欢

转载自www.cnblogs.com/hehecat/p/9664189.html
今日推荐