Android 使用MVP模式 实现一个查询功能。

以前一直,用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值