通过获取Android应用程序列表谈MVC模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值