以前一直,用mvc开发,现在到处都听说MVP,MVP的。。所以就看了下。然后简单的实现一个查询到功能。
1,在我学习之前,我最困惑的 就是 先写哪个接口,或者说先写哪个类。导致了,无从下手的感觉,后来直接 先把别人的代码敲两边。然后,,,然后就懂了。。。是的 代码就是要敲。
是这样子的。实现一个查询。
首先,查询需要什么?
①查询方法吧。
②存放结果的实体类吧。
③具体的逻辑吧
④展示结果的页面吧。
好了。明白了具体步骤,就开始实施了。
第一步:①对应了一个查询方法:那么
/**
* Created by Administrator on 2017/5/24/024.
*
* 这个接口 就是为了 Model 接口实现也就是第一步的具体实现
*/
public interface IListModel {
void query(onQueryCallback callback);
}
查询结果要通过接口传给P层。 所以,就要写一个接口回调了。
结果是,要么成功要么失败。。成功把数据传过去。
/**
* Created by Administrator on 2017/5/24/024.
* 查询结果回调。
*/
public interface onQueryCallback {
void onSuccess(List<DataBean> list);
void onError();
}
①,查询方法 具体实现
/**
* Created by Administrator on 2017/5/24/024.
* 模型实现上面的接口
*/
public class ListModelImpl implements IListModel {
private static final String TAG = "查询";
private List<DataBean> list;
@Override
public void query(onQueryCallback callback) {
list=new ArrayList<>();
//这里相当于网络查询,
for (int i = 0; i <50 ; i++) {
list.add(new DataBean("张三"+i));
Log.e(TAG, "query: "+list.get(i).getName() );
}
//通过接口把结果传过去
callback.onSuccess(list);
}
}
②存放结果的实体类。
public class DataBean {
private String name;
public DataBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在写P层之前 先把 页面写好。以及P层需要调用的方法(改变控件,刷新等。操作)。
先写个接口,把有可能用得到的 方法写出来
public interface IMainView {
//这里就用到了 三个方法,一个是通知适配器改变
void notDataAdapter(List<DataBean> list);
//没有数据时 或,失败时。弹出 友好提示
void showView();
//有数据时隐藏、
void hintView();
}
接下来 还是 具体实现这些接口
public class MainActivity extends AppCompatActivity implements IMainView{
private ListView listView;
private TextView isnull;
private List<DataBean> lists; //和最开始那里的数据 保持一致
private ListAdapter adapter;//
private MainPresener pr; //P层
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
listView= (ListView) findViewById(R.id.re_list);
isnull= (TextView) findViewById(R.id.isnulltv);
pr=new MainPresener(this);//这里P类不要忘记new 了
lists=new ArrayList<>();
adapter=new ListAdapter();
listView.setAdapter(adapter);
pr.query();
}
@Override
public void notDataAdapter(List<DataBean> list) {
lists=list;
Log.e("查询:通知", "onSuccess: ");
adapter.notifyDataSetChanged();
}
@Override
public void showView() {
Log.e("查询:显示", "onSuccess: " );
isnull.setVisibility(View.VISIBLE);
}
@Override
public void hintView() {
isnull.setVisibility(View.GONE);
Log.e("查询:隐藏", "onSuccess: " );
}
//适配器其实应该 写在别的地方的。但是 为了 省事,就放在一起了哈。
public class ListAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
ViewHolder vh=null;
if (vh==null){
vh=new ViewHolder();
v =getLayoutInflater().inflate(R.layout.item,parent,false);
vh.textView= (TextView) v.findViewById(R.id.name_tv);
v.setTag(vh);
}else{
vh= (ViewHolder) v.getTag();
}
vh.textView.setText(lists.get(position).getName());
Log.e("查询list", "query: "+lists.get(position).getName() );
return v;
}
public class ViewHolder{
TextView textView;
}
}
}
③逻辑层 P层。
/**
* Created by Administrator on 2017/5/24/024.
* 这层主要是处理业务逻辑,通过model的结果。再利用 ImaninView接口 中的 来操作不同的界面变化
*/
public class MainPresener {
private IMainView iMainView;//通过这个接口 调用 View层的操作页面的方法。
private IListModel iListModel;//这个接口的
public MainPresener(IMainView iMainView) {
this.iMainView = iMainView;
this.iListModel = new ListModelImpl();//注意:这里。我们要new出他的具体实现类。
}
public void query(){
//Model 通过 接口 传过来之后。 这里通过接口。得到值。 在判断值。根据值 调用不同的结果。
iListModel.query(new onQueryCallback() {
@Override
public void onSuccess(List<DataBean> list) {
if (list!=null){
//把list 传到页面上去 顺便通知适配器
iMainView.notDataAdapter(list);
iMainView.hintView();
Log.e("查询:P", "onSuccess4: "+list.get(3).getName());
}else{
iMainView.showView();
Log.e("查询:P", "onSuccess:11114 "+list.get(4).getName());
}
}
@Override
public void onError() {
iMainView.hintView();
}
});
}
}
现在写项目还是用MVC 来写,毕竟这个MVP 用的代码量有点多。能用一个页面来写的,,为啥还有这么都页面。。。
不过学会使用就行了。
以上哪里写的不够明确或者,需要改进的地方,请大家指点下。附带demo 这个demo 里面有 登录注册。两种写法。以及本章的查询demo