Android--MVP架构设计Listview
2016-08-30 23:57
429 查看
MVP:Model View Presenter
Model:业务逻辑(加载数据)
View:视图(显示数据)
Presenter:中间者(绑定Model和View)
实现效果
创建View 的接口
创建Model的接口
创建ModelImpl的接口
创建Presenter接口
Activity代码
为了防止View进程在Model(加载数据)未完成时,View被回收。需要将actvity继承MVPBaseActivity以及persenter继承BasePersenter 代码如下:
BasePresenter代码
MVPBaseActivity代码
Adapter代码 (实现简单的2个TextView)
Model:业务逻辑(加载数据)
View:视图(显示数据)
Presenter:中间者(绑定Model和View)
实现效果
创建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; } }
相关文章推荐
- 基于MVP设计模式的Android应用架构设计
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android mvp 设计模式目录架构设计
- MVX Android设计架构浅析-MVP
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android设计架构:MVC/MVP
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android MVP设计架构实现
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android MVP设计框架模板 之 漂亮ListView上拉刷新下拉加载更多
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈