MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。----引自百度百科。
网络上讲解MVC模式的文献一搜一大把,今天我们把理论与实际结合一下,通过获取Android手机应用列表来实际看一看什么是MVC,有问题大家一起交流。
整个程序分为三个文件MainActivity.java, AppInfoProvider.java, AppInfo.java,分别对应MVC中的View,Controller和Model,AppInfo.java定义了一个应用程序信息类,AppInfoProvider.java获取系统的应用列表,改变Model的数据,最后MainActivity.java用于显示改变后的数据(即获得的应用程序列表)。下面是代码,代码中有注释,比较简单,太详细的可以交流或者自行google:
MainActivity.java
package com.sun.baseadaptermvc;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
/**
* MVC中的View(视图),将获得Model(即APPInfo在这里)对象列表显示在View界面里面。
*
* @author 孙世华
*
*/
public class MainActivity extends Activity {
private List<AppInfo> appInfos;
private AppInfoProvider provider;
private ListView mylist;
private LinearLayout ll_app_manager_loading;
private MyAdapter adapter;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ll_app_manager_loading.setVisibility(View.INVISIBLE);
adapter = new MyAdapter();
mylist.setAdapter(adapter);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
provider = new AppInfoProvider(this);
mylist = (ListView) findViewById(R.id.mylist);
ll_app_manager_loading = (LinearLayout) findViewById(R.id.ll_app_manager_loading);
initUI();
mylist.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
// TODO Auto-generated method stub
AppInfo appInfo = (AppInfo) mylist.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), "您选择了" + appInfo.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void initUI() {
// ll_app_manager_loading.setVisibility(View.VISIBLE);
new Thread() {
@Override
public void run() {
appInfos = provider.getAllApps();
handler.sendEmptyMessage(0);
}
}.start();
}
private class MyAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = null;
if (convertView == null) {
view = View.inflate(getApplicationContext(), R.layout.app_item, null);
} else {
view = convertView;
}
// 更改View对象的状态
AppInfo info = appInfos.get(position);
ImageView iv = (ImageView) view.findViewById(R.id.iv_app_icon);
TextView tv = (TextView) view.findViewById(R.id.tv_app_name);
iv.setImageDrawable(info.getIcon());
tv.setText(info.getName());
return view;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return appInfos.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return appInfos.size();
}
}
}
AppInfoProvider.java
package com.sun.baseadaptermvc;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
/**
* MVC中的Controller(控制器),获取Model对象列表数据,并返回最终修改(获得的)的AppInfo对象列表。
*
* @author 孙世华
*
*/
public class AppInfoProvider {
private Context context;
private PackageManager packageManager;
public AppInfoProvider(Context context) {
// super();
this.context = context;
this.packageManager = context.getPackageManager();
}
public List<AppInfo> getAllApps() {
List<AppInfo> listinfos = new ArrayList<AppInfo>();
List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo packageInfo : packageInfos) {
AppInfo myApp = new AppInfo();
ApplicationInfo appinfo = packageInfo.applicationInfo;
Drawable icon = appinfo.loadIcon(packageManager);
myApp.setIcon(icon);
String appname = appinfo.loadLabel(packageManager).toString();
myApp.setName(appname);
String packname = packageInfo.packageName;
myApp.setPackname(packname);
listinfos.add(myApp);
}
return listinfos;
}
}
AppInfo.java
package com.sun.baseadaptermvc;
import android.graphics.drawable.Drawable;
/**
* 应用程序实体
* MVC中的Model(模型),用于建立一个模型对象实体,在此处就是要显示的应用程序的图标和应用程序名称
* @author 孙世华
*
*/
public class AppInfo {
private Drawable icon;
private String name;
private String packname;
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPackname() {
return packname;
}
public void setPackname(String packname) {
this.packname = packname;
}
}
布局文件有两个,activity_main.xml和app_item.xml,其余的不重要的xml文件就不列了:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.sun.baseadaptermvc.MainActivity" >
<ListView
android:id="@+id/mylist"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
<LinearLayout
android:id="@+id/ll_app_manager_loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical"
android:visibility="invisible" >
<ProgressBar
android:id="@+id/pb_app_manager"
android:layout_width="60dp"
android:layout_height="60dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在拼了命加载..."
android:textColor="@android:color/black"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
app_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="65dip"
android:background="@drawable/item_background_selector"
android:gravity="center_vertical" >
<ImageView
android:id="@+id/iv_app_icon"
android:layout_width="60dip"
android:layout_height="60dip"
android:layout_alignParentLeft="true"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_app_icon"
android:paddingLeft="5dp"
android:text="功能名字"
android:textColor="@color/textcolor"
android:textSize="22sp" />
</RelativeLayout>
结果如下:
为方便学习交流,源代码已经上传至:http://download.csdn.net/detail/sunshihua12829/9488758