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でこれらの仕事をしています.
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で実装されているコードを継承するごとにかなり少なくなります!よしここまで