AndroidのMVPモードの入門
27181 ワード
まずMVCモードについてお話ししますが、webにはMVCモードという古典的なモードがあることを知っています.では、3つはそれぞれどんな役ですか.
M:営業単位
C:Controller(一般的にservlet)
V:ビューは一般的にjspで、
例えば、各サイトにはシステム登録機能がありますが、私たちが見ている関連情報を記入するページのものはjspです.もちろんaspなどもあります.記入したら登録ボタンを押してください.実はこの操作はservletに渡して処理します.serveltがデータベースにそのユーザーがいないことを調べると(ビジネスロジック、この場合一般的にエンティティが生成されます)、ユーザーの登録に成功するように要求され、servletはjspにデータを渡し、jspはこれらのデータを表示し、ユーザーに登録に成功したことを伝えます.
androidでは、MVCが提示されているのは明らかではありません.activityはC(Controller)でもV(表示ビュー)なので、android MVCモードの開発、彼の論理と表示がどのように分離されているのか、MVPモードができるのかを聞く人が多いので、例を書いてみましょう.そしてMVPモードについてお話しします
私たちは伝統的にactivityでこれらの仕事をしています.
ここではsetContentView()が明らかになり、findView ById()の表示ビューが何かありますが、tv.setText(「MVPモードを勉強したいのですが、吊り下げているそうです」);このようにコード結合度は少し高く、私たちはそれを分離したほうがいいです.今、MVPモードを使用してどのように分離しますか.
私たちはすべてのactivityがsetContentView()を必要とすることを知っています.私たちjavaのオブジェクト向けの考え方に従って多重化し、親クラスを抽出し、各子クラスを継承すればいいのですが、具体的な子クラスの実現を知らないので、抽象的なものを定義するには、BaseActivityを定義します.
しかしBaseActivityクラスでこのように書くのはだめですね.具体的なサブクラスビューが何なのか分からないので、抽象的にサブクラスに自分のビューを実現させなければなりません.androidではLayoutInflaterクラスがlayoutファイルをViewに変換し、setContnetView(view)を通じてインタフェースを定義することができることを知っています.
私たちは今activityで私たちのビジネスを直接処理すればいいことを発見しました.findView()とsetContentView()はクラスにカプセル化され、インタフェースを使用して分離されています.
これらの操作でMVPのキャラクターは
M:これは簡単な使用でmodeは使われていません.
C:現在のactivityは本当にビジネスロジックを制御し、処理しています.
P:MainViewはMとCを結ぶ橋です.
このようにメンテナンスがよく、コードが以前よりはっきりしていますが、より多くのクラスが導入されているのがMVPの欠点でしょう.
これをadapterで使ってみましょう
MyBaseAdapter.JAvaというクラスはパッケージ化されていますが、具体的にはコードを見てください.
サブクラスの実装:
表示:
これでMyBaseAdapterで実装されているコードを継承するごとにかなり少なくなります!よしここまで
M:営業単位
C:Controller(一般的にservlet)
V:ビューは一般的にjspで、
例えば、各サイトにはシステム登録機能がありますが、私たちが見ている関連情報を記入するページのものはjspです.もちろんaspなどもあります.記入したら登録ボタンを押してください.実はこの操作はservletに渡して処理します.serveltがデータベースにそのユーザーがいないことを調べると(ビジネスロジック、この場合一般的にエンティティが生成されます)、ユーザーの登録に成功するように要求され、servletはjspにデータを渡し、jspはこれらのデータを表示し、ユーザーに登録に成功したことを伝えます.
androidでは、MVCが提示されているのは明らかではありません.activityはC(Controller)でもV(表示ビュー)なので、android MVCモードの開発、彼の論理と表示がどのように分離されているのか、MVPモードができるのかを聞く人が多いので、例を書いてみましょう.そしてMVPモードについてお話しします
私たちは伝統的にactivityでこれらの仕事をしています.
package com.zhimore.mvppatterndemo;
import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
tv = (TextView) findViewById(R.id.tv);
tv.setText(" MVP , ");
}
}
ここではsetContentView()が明らかになり、findView ById()の表示ビューが何かありますが、tv.setText(「MVPモードを勉強したいのですが、吊り下げているそうです」);このようにコード結合度は少し高く、私たちはそれを分離したほうがいいです.今、MVPモードを使用してどのように分離しますか.
私たちはすべてのactivityがsetContentView()を必要とすることを知っています.私たちjavaのオブジェクト向けの考え方に従って多重化し、親クラスを抽出し、各子クラスを継承すればいいのですが、具体的な子クラスの実現を知らないので、抽象的なものを定義するには、BaseActivityを定義します.
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
}
}
しかしBaseActivityクラスでこのように書くのはだめですね.具体的なサブクラスビューが何なのか分からないので、抽象的にサブクラスに自分のビューを実現させなければなりません.androidではLayoutInflaterクラスがlayoutファイルをViewに変換し、setContnetView(view)を通じてインタフェースを定義することができることを知っています.
package com.zhimore.impl.view;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Administrator on 2016/2/23.
*/
public interface IView {
// view
public void initView(LayoutInflater inflater ,ViewGroup viewGroup);
// view
public View getView();
}
package com.zhimore.base;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import com.zhimore.impl.view.IView;
import com.zhimore.mvppatterndemo.R;
/**
* Created by Administrator on 2016/2/23.
*/
public abstract class BaseActivity<SubView extends IView> extends Activity {
public SubView mSubView;
public View mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
LayoutInflater inflater = getLayoutInflater();
mSubView = getSubClass().newInstance();//
mSubView.initView(inflater,null);// view
mView = mSubView.getView();// view
setContentView(mView);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public abstract Class<SubView> getSubClass() ;
}
package com.zhimore.mvppatterndemo;
import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import com.zhimore.base.BaseActivity;
import com.zhimore.view.MainView;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSubView. tv.setText(" MVP , ");
}
@Override
public Class getSubClass() {
return MainView.class;
}
}
package com.zhimore.view;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.zhimore.impl.view.IView;
import com.zhimore.mvppatterndemo.R;
/**
* Created by Administrator on 2016/2/23.
*/
public class MainView implements IView {
public View mView;
public TextView tv;
@Override
public void initView(LayoutInflater inflater, ViewGroup viewGroup) {
mView = inflater.inflate(R.layout.content_main,viewGroup);
findView();
}
private void findView() {
tv = (TextView) mView.findViewById(R.id.tv);
}
@Override
public View getView() {
return mView;
}
}
私たちは今activityで私たちのビジネスを直接処理すればいいことを発見しました.findView()とsetContentView()はクラスにカプセル化され、インタフェースを使用して分離されています.
これらの操作でMVPのキャラクターは
M:これは簡単な使用でmodeは使われていません.
C:現在のactivityは本当にビジネスロジックを制御し、処理しています.
P:MainViewはMとCを結ぶ橋です.
このようにメンテナンスがよく、コードが以前よりはっきりしていますが、より多くのクラスが導入されているのがMVPの欠点でしょう.
これをadapterで使ってみましょう
MyBaseAdapter.JAvaというクラスはパッケージ化されていますが、具体的にはコードを見てください.
package com.zhimore.base;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.zhimore.impl.view.IView;
import java.util.List;
/**
* Created by Administrator on 2016/2/23.
*/
public abstract class MyBaseAdapter<SubAdapterView extends IView,Y extends List> extends BaseAdapter {
private static final String TAG ="MyBaseAdapter" ;
public SubAdapterView mSubAdapterView;
private LayoutInflater inflater;
private Y tempT;
public void setTempT(Y tempT) {
this.tempT = tempT;
}
public MyBaseAdapter(LayoutInflater inflater) {
this.inflater = inflater;
try {
mSubAdapterView = getSubAdapterClass().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
try {
mSubAdapterView.initView(inflater,parent);
convertView = mSubAdapterView.getView();
convertView.setTag(mSubAdapterView);
} catch (Exception e) {
e.printStackTrace();
}
}else{
mSubAdapterView = (SubAdapterView) convertView.getTag();
}
if(convertView!=null){
onBindData();
}
return convertView;
}
//
protected abstract void onBindData();
public abstract Class<SubAdapterView> getSubAdapterClass();
@Override
public int getCount() {
return tempT!=null?tempT.size():0;
}
@Override
public Object getItem(int position) {
return tempT.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
サブクラスの実装:
package com.adapter;
import android.view.LayoutInflater;
import com.zhimore.base.MyBaseAdapter;
import com.zhimore.view.NewsView;
import java.util.List;
/**
* Created by Administrator on 2016/2/23.
*/
public class NewsAdapter extends MyBaseAdapter,List> {
public NewsAdapter(LayoutInflater inflater) {
super(inflater);
}
@Override
protected void onBindData() {
mSubAdapterView.tv_show_news.setText(" ");
}
@Override
public Class getSubAdapterClass() {
return NewsView.class;
}
}
表示:
package com.zhimore.mvppatterndemo;
import android.os.Bundle;
import com.adapter.NewsAdapter;
import com.zhimore.base.BaseActivity;
import com.zhimore.view.MainView;
import com.zhimore.view.MainView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends BaseActivity {
private NewsAdapter adapter;
private List mDatas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDatas = new ArrayList<>();
for(int i=0;i<100;i++){
mDatas.add("mvp , ");
}
adapter = new NewsAdapter(getLayoutInflater());
adapter.setTempT(mDatas);
mSubView.listview.setAdapter(adapter);
}
@Override
public Class getSubClass() {
return MainView.class;
}
}
これでMyBaseAdapterで実装されているコードを継承するごとにかなり少なくなります!よしここまで