Android--MVP架构设计Listview

原创 2016年08月30日 23:57:07

MVP:Model View Presenter
Model:业务逻辑(加载数据)
View:视图(显示数据)
Presenter:中间者(绑定Model和View)

实现效果Demo运行效果

创建View 的接口

public interface JView {
    /*加载进度条*/
    void showLoading();
    /*显示数据*/
    void showData(List<JEntityData> datas);
}

创建Model的接口

public interface JModel {
    /**
     * 加载数据
     */
    void loadData(DataOnLoadListener listener);
    /**
     *加载完成的监听
     */
    interface DataOnLoadListener{
        void  onComplete(List<JEntityData> datas);

    }
}

创建ModelImpl的接口

public class JModelImpl implements JModel{
    @Override
    public void loadData(DataOnLoadListener listener) {
        List<JEntityData> datas=new ArrayList<JEntityData>();
        datas.add(new JEntityData("NAME11111111111111",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));
        datas.add(new JEntityData("NAME111222222222221",1,"123"));

        //回调监听
        listener.onComplete(datas);
    }

}

创建Presenter接口

public class JPresenter extends BasePresenter<JView> {
//    view interface
    JView mView;
//    model interface
    JModel mModel =new JModelImpl();
/**
 * 通过构造方法实例化mView
 * */
    public JPresenter(JView mView) {
        this.mView = mView;
    }

    /*绑定view和model*/
    public void fetch(){
        //显示进度条
        mView.showLoading();
        //让Modle加载数据
        if(mModel!=null){
            mModel.loadData(new JModel.DataOnLoadListener() {
                @Override
                public void onComplete(List<JEntityData> datas) {
                    //给View显示
                    mView.showData(datas);
                }
            });
        }
    }
}

Activity代码

public class MainActivity extends MVPBaseActivity<JView,JPresenter> implements JView{
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView= (ListView) findViewById(R.id.listView_id);
//        listView.setAdapter(new ListViewAdapter(this));
        //中间者,让他触发加载数据
//    不继承 MVPBaseActivity    new JPresenter(this).fetch();
        mPresenter.fetch();
    }

    @Override
    protected JPresenter createPresenter() {
        return new JPresenter(this);
    }

    @Override
    public void showLoading() {
        Toast.makeText(this,"正在加载",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showData(List<JEntityData> datas) {
        listView.setAdapter(new ListViewAdapter(this,datas));
    }


}

为了防止View进程在Model(加载数据)未完成时,View被回收。需要将actvity继承MVPBaseActivity以及persenter继承BasePersenter 代码如下:
BasePresenter代码

public abstract class BasePresenter<T> {
  /*
  * 当内存不足可释放内存
  * */
    protected WeakReference<T> mViewRef;
    /*
    * 绑定presenter View
    * */
    public void attchView(T view){
        mViewRef=new WeakReference<T>(view);
    }

    /*
    * 解除管理
    * */
    public void detachView(){
        if (mViewRef!=null){
            mViewRef.clear();
            mViewRef=null;
        }
    }

    protected T getView(){
        return mViewRef.get();
    }
}

MVPBaseActivity代码

public abstract class MVPBaseActivity<A,T extends BasePresenter<A>> extends AppCompatActivity {
    protected T mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        创建Presenter
        mPresenter=createPresenter();
//        内存泄漏
//        关联view
        mPresenter.attchView((A) this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
//        解除关联
        mPresenter.detachView();
    }

    protected abstract T createPresenter();
}

Adapter代码 (实现简单的2个TextView)

public class ListViewAdapter extends BaseAdapter{
    private List<JEntityData> list;
    private LayoutInflater inflater;
    public ListViewAdapter(Context context,List<JEntityData> list) {
        this.inflater=LayoutInflater.from(context);
        this.list=list;
    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder=null;
        if (view==null){
            viewHolder=new ViewHolder();
            view=inflater.inflate(R.layout.item_list,null);
            viewHolder.name= (TextView) view.findViewById(R.id.name);
            viewHolder.text= (TextView) view.findViewById(R.id.text);
            view.setTag(viewHolder);
        }else {
            viewHolder=(ViewHolder) view.getTag();
        }
        viewHolder.name.setText(list.get(i).getName());
        viewHolder.name.setText(list.get(i).getPhoto());
        return view;
    }

    class ViewHolder{
        TextView name;
        TextView text;
    }
}

相关文章推荐

Android mvp架构设计demo

  • 2016年10月10日 09:30
  • 26.57MB
  • 下载

Android App的架构设计:从VM、MVC、MVP到MVVM

随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了。如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高...

Android APP架构设计——MVP的使用示例

0. 前言为了更好地进行移动端架构设计,我们最常用的就是MVC、MVP和MVVM,作为三个最耳熟能详的三大架构,应用可谓非常广泛。对于这三种架构设计以及优缺点已经在Android APP架构设计——M...

【架构设计】MVP与MVC,实现Android应用层开发

背景 之所以要谈这个话题是因为你在开发App时可能会发现,Activity担负的责任非常之重,如果站在MVC框架角度看自己开发的App,一般xml布局文件科Activity的setConte...

Android架构设计---MVP模式第(二)篇,如何减少类爆炸

今天是2017年3月16日,差不多一年前,写过一篇MVP基础类型的文章Android架构设计—MVP模式第(一)篇,梳理了一下MVP怎么使用。OK,先回忆一下。一、基础知识1.1、MVP分层总共分成三...

浅谈Android架构设计模式中MVC、MVP、MVVM

以下基于对三种模式已经熟悉所总结,不会介绍模式的基础概念,以下是自己结合其他人和自己实际开发中的经验对这些概念一些感悟。 Activity是V还是C 对于Activity属于V还是属于C这...
  • ourpush
  • ourpush
  • 2016年10月01日 22:16
  • 279

Android Mvp架构设计与性能优化

Android Mvp架构设计与性能优化 什么是mvp架构设计? MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。   模型(Mode...

基于MVP设计模式的Android应用架构设计

0前言 昨天在QQ空间看到一位IOS工程师设计的APP架构,由于对此大神比较崇拜就研究了哈IOSAPP架构,发现移动端APP开发还是有很多相同的地方。下图为IOS大神设计的APP架构图。 ...

【架构设计】MVP模式与MVC模式

MVP模式与MVC模式   2010-06-24 作者:宏宇 来源:宏宇的blog   MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presente...
  • qs_csu
  • qs_csu
  • 2012年12月04日 14:01
  • 827

架构设计之MVP

一、简介   MVP (Model-View-Presenter),MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Mode...
  • haoaoo
  • haoaoo
  • 2017年04月17日 16:41
  • 781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android--MVP架构设计Listview
举报原因:
原因补充:

(最多只允许输入30个字)