相比上一篇博客所写的一个最基本MVP模型,这篇博客则加入依赖注入,使MVP模型结构更清晰,解耦效果更好。直接用代码说话吧!
需要添加的jar包:build.gradle
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.androidxx.yangjw.day37_dagger2_butterknife_mvp_xutils_demo"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
compile 'com.google.dagger:dagger:2.7'
apt 'com.google.dagger:dagger-compiler:2.7'
compile 'org.xutils:xutils:3.3.36'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.squareup.picasso:picasso:2.5.2'
}
MyApplication:
import android.app.Application;
import org.xutils.x;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//完成Xtuils的初始化
x.Ext.init(this);
}
}
View层:
ISelectedView:
public interface ISelectedView {
/**
* 接收Presenter层返回的结果
* @param selectedBean
*/
void setListDatas(SelectedBean selectedBean);
}
MainActivity:
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity implements ISelectedView{
@BindView(R.id.guide_selected_list_lv)
ListView mListView;
@Inject
IGuidePresenter mGuidePresenter;
private List<SelectedBean.DataBean.ItemsBean> itemsBeanList = new ArrayList<>();
private SelectedAdapter selectedAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
DaggerAppComponent.create().inject(this);
mGuidePresenter.setSelectedView(this);
mGuidePresenter.querySelectedList(1);
selectedAdapter = new SelectedAdapter(itemsBeanList,this);
mListView.setAdapter(selectedAdapter);
}
@Override
public void setListDatas(SelectedBean selectedBean) {
//接收Presenter返回的数据
if (selectedBean != null) {
LogUtils.log(MainActivity.class,""+selectedBean.getCode());
if (selectedBean.getData() != null) {
itemsBeanList.addAll(selectedBean.getData().getItems());
selectedAdapter.notifyDataSetChanged();
}
}
}
}
SelectedAdapter:
public class SelectedAdapter extends BaseAdapter {
private List<SelectedBean.DataBean.ItemsBean> beanList ;
private Context mContext;
private LayoutInflater mLayoutInfalter;
public SelectedAdapter(List<SelectedBean.DataBean.ItemsBean> beanList, Context mContext) {
this.beanList = beanList;
this.mContext = mContext;
mLayoutInfalter = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return beanList == null ? 0 : beanList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder viewHolder = null;
if (view == null) {
view = mLayoutInfalter.inflate(R.layout.guide_selected_item_view,parent,false);
viewHolder = new ViewHolder(view);
} else {
viewHolder = (ViewHolder) view.getTag();
}
SelectedBean.DataBean.ItemsBean itemsBean = beanList.get(position);
if (itemsBean != null) {
String title = itemsBean.getTitle();
viewHolder.mTitleTxt.setText(title);
Picasso.with(mContext).load(itemsBean.getCover_image_url()).into(viewHolder.mImageView);
}
return view;
}
class ViewHolder {
@BindView(R.id.guide_selected_item_iv)
ImageView mImageView;
@BindView(R.id.guide_selected_item_title_txt)
TextView mTitleTxt;
public ViewHolder(View view) {
view.setTag(this);
ButterKnife.bind(this,view);
}
}
}
Presenter层:
IGuidePresenter
public interface IGuidePresenter {
void setSelectedView(ISelectedView selectedView);
/**
* 加载指南精选列表数据
* @param pageno
*/
void querySelectedList(int pageno);
interface Callback {
void success(int responseCode, SelectedBean selectedBean);
}
}
GuidePresenter:
public class GuidePresenter implements IGuidePresenter,IGuidePresenter.Callback{
private IGuideModel mGuideModel;
private ISelectedView selectedView;
public GuidePresenter(IGuideModel guideModel) {
this.mGuideModel = guideModel;
}
@Override
public void setSelectedView(ISelectedView selectedView) {
this.selectedView = selectedView;
}
@Override
public void querySelectedList(int pageno) {
this.mGuideModel.querySelectedList(pageno,this);
}
@Override
public void success(int responseCode, SelectedBean selectedBean) {
//获取Model的结果
this.selectedView.setListDatas(selectedBean);
}
}
model层:
public interface IGuideModel {
void querySelectedList(int pageno,IGuidePresenter.Callback callback);
}
GuideModel:
public class GuideModel implements IGuideModel{
private Gson gson;
public GuideModel(Gson gson) {
this.gson = gson;
}
@Override
public void querySelectedList(int pageno,final IGuidePresenter.Callback callback) {
RequestParams requestParams = new RequestParams(URLConstant.GUIDE_SELECTED_URL);
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
LogUtils.log(GuideModel.class,result);
SelectedBean selectedBean = gson.fromJson(result, SelectedBean.class);
callback.success(1,selectedBean);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
}
dagger:
AppComponent:
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
AppModule:
@Module
public class AppModule {
@Provides
public Gson provideGson() {
return new Gson();
}
@Provides
public IGuideModel provideGuideModule(Gson gson) {
return new GuideModel(gson);
}
@Provides
public IGuidePresenter provideGuidePresenter(IGuideModel guideModel) {
return new GuidePresenter(guideModel);
}
}
URLConstant:
public class URLConstant {
/**
* 指南--精选--列表
*/
public static final String GUIDE_SELECTED_URL = "http://";
}
由于布局文件相对简单,我就不附代码了!