安卓基础学习4

0 数据库业务代码的封装
1 listview的入门  BaseAdapter
2 listView 获取数据库的数据
3 采用布局填充器把xml文件转换成view对象
4 常见数据适配器ArrayAdapter
5 常用适配器SimpleAdapter
6 内容提供者工作的原理
7 内容提供者的增删改查
8 内容观察者的原理
9 读取联系人
10 插入联系人
11 通过内容观察者检测短信的到来


0 数据库业务代码的封装
  在service包底下封装一个MmService业务类,里面实现crud的方法,
  让MainActivity直接使用。


1 listview的入门  
  ListView 高级控件。列表显示控件 
  每个条目的相似度都特别高

  开发中如果我们的数据是对象集合那么要列表显示:ListView 

private class Myadapter extends BaseAdapter {
		private Context context;
		private List<Person> list;
		private LayoutInflater li;

		public Myadapter(Context context, List<Person> list) {
			// TODO Auto-generated constructor stub
			this.context = context;
			this.list = list;
			li = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();//此处是告知系统有多少条记录需要显示,如果返回0的话界面将不显示任何数据
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return 0;
		}
<span style="white-space:pre">		</span>//每个条目显示都会调用下面的方法,为了节省内存,条目索引在屏幕中的时候创建,滚动消失后销毁。
		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			View v = li.inflate(R.layout.activity_main, null);
			TextView tv1 = (TextView) v.findViewById(R.id.tv_1);
			TextView tv2 = (TextView) v.findViewById(R.id.tv_2);
			TextView tv3 = (TextView) v.findViewById(R.id.tv_3);
			Person p = list.get(arg0);
			tv1.setText(p.getName());
			tv2.setText(p.get_id()+"");
			tv3.setText(p.getAge()+"");

			return v;
		}

	}




05-28 02:37:08.893: E/AndroidRuntime(5262): android.content.res.Resources$NotFoundException: String resource ID #0x1
注意:我们在给TextView赋值的时候要注意:
  如果值是int类型需要加上""



在getView()方法上
找控件必须是view.findViewById();
如果说你在使用适配器的时候出现空指针异常。


java  oop 
抽象  封装
继承  
多态  :不确定    多种形态 
abstract   interface   


View   


方法传递的问题
Context  上下文  Activity间接继承自Context
1 什么时候传递上下文
2 什么时候使用this   getApplicationContext();


解答:
1 你什么时候调用方法,发现该方法的参数需要上下文,就传  


2 this  当前类的类对象  
  Activity里面
  getApplicationContext()   Activity里面有这样的方法


调用方法:
1 别人写的  
2 自己写的 方法    因为方法里面需要使用到Context,并且 


注意:不要太死板    编程太大忌   
1 思路**************(学习的重点 )
  先写思路:
2 编程  


1 完成短信发送器
  布局 是什么效果:
  1 完成布局  
  2 点击按钮发送短信
   2.1 怎么样知道按钮点击了? 设置监听
   2.2 怎么获取号码和短信内容  et_number.getText().toString();
   2.3 怎么发送短信?
       SmsManager   




3 Listview加强版 :




上午总结:
1 MmService 
2 ListView  
  ListActivity
  Adapter --> ListAdapter  -->BaseAdapter getCount()  getView()
  view.findViewById()
3 加载一个布局文件到java代码  LayoutInflater  
  
6 内容提供者工作的原理  
  内容提供者:四大组件之一  
  android是基于组件的开发。四大组件
  Activity  ContentProvider   Service  BroadcastReceiver 
  ContentProvider 在android中的作用是对外共享数据 


android:authorities="" 授权:域名 


***暴露内容提供者
1 MyContentProvider extends ContentProvider 
2 在清单中配置 provider 
  name  authorities :域名 


***访问内容提供者
ContentResolver cr = getContentResolver();
cr.query(Uri.parse("content://wuhan"), null, null, null, null);
 
Uri:统一资源识别   


URL  


在操作系统中有很多的内容提供者
05-28 08:36:36.723: W/ActivityManager(1007): Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{b6770748 16456:com.itcast.calls/u0a61} (pid=16456, uid=10061) requires android.permission.READ_CALL_LOG or android.permission.WRITE_CALL_LOG


  ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10); 
//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10


parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10


总结:
1 MMService  crud  封装  
2 ListView   ************
  ListActivity  
  Adapter  BaseAdapter   **********
  ArrayAdapter  SimpleAdapter 
  3 Listview加强版
3 内容提供者 *********
  8 内容提供者暴露SqliteDatabase
  9-访问内容提供者的加强版 


4 10-通话记录列表显示************

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.itcast.calls.domain.CallInfo;

public class MainActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		ListView lv = getListView();
		
		List<CallInfo> callInfos = new ArrayList<CallInfo>();
		
		//如何查询Calls表  通过内容提供者对外暴露了
		ContentResolver cr = getContentResolver();
		Uri uri = Uri.parse("content://call_log/calls");
		Cursor c = cr.query(uri, new String[]{"number","date","type"}, null, null, "date desc");
		while(c.moveToNext()){
			String number = c.getString(0);
			long date = c.getLong(1);
			int type = c.getInt(2);
			CallInfo callInfo = new CallInfo(number, date, type);
			callInfos.add(callInfo);
		}
		c.close();
		
		
		MyAdapter adapter = new MyAdapter(this, callInfos);
		
		lv.setAdapter(adapter);
	}
	
	private class MyAdapter extends BaseAdapter{

		private Context context;
		private List<CallInfo> callInfos;
		private LayoutInflater mInflater;
		
		public MyAdapter(Context context, List<CallInfo> callInfos) {
			super();
			this.context = context;
			this.callInfos = callInfos;
			mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return callInfos.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			View view = mInflater.inflate(R.layout.item, null);
			
			TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
			TextView tv_date = (TextView) view.findViewById(R.id.tv_date);
			TextView tv_type = (TextView) view.findViewById(R.id.tv_type);
			
			CallInfo callInfo = callInfos.get(position);
			
			tv_number.setText(callInfo.number);
			
			//日期格式化
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			String dateStr = format.format(callInfo.date);
			
			tv_date.setText(dateStr);
			
			String typeStr = null;
			switch (callInfo.type) {
			case Calls.INCOMING_TYPE://来电
				typeStr = "来电";
				break;
			case Calls.OUTGOING_TYPE://去电
				typeStr = "去电";
				break;
			case Calls.MISSED_TYPE://未接
				typeStr = "未接";
				break;

			default:
				break;
			}
			tv_type.setText(typeStr);
			
			return view;
		}
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}



作业:
短信 :packages\providers\TelephonyProvider 源代码的位置

短信列表显示

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private ContentResolver resolver;
	private LayoutInflater mInflater;
	private ListView lv = null;
	private List<Map<String, String>> list = new ArrayList<Map<String, String>>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_smslist);
		mInflater = LayoutInflater.from(this);
		resolver = getContentResolver();
		
		readSms();
		lv = (ListView) findViewById(R.id.lv);
		lv.setAdapter(new BaseAdapter() {
			
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				Map<String, String> map = list.get(position);
				View view = mInflater.inflate(R.layout.item, null);
				
				TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
				TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
				String type=map.get("type").equals("1")?"Send From:":"Send To:";
				tv_number.setText(type+map.get("number"));
				tv_content.setText(map.get("body"));
				
				return view;
			}
			
			@Override
			public long getItemId(int position) {
				// TODO Auto-generated method stub
				return 0;
			}
			
			@Override
			public Object getItem(int position) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return list.size();
			}
		});
		
	}
	
	public void readSms(){
		Uri uri = Uri.parse("content://sms");
		Cursor c = resolver.query(uri, new String[] { "address", "date",
				"type", "body", "date_sent" }, null, null, null);
		if (c != null) {
			while (c.moveToNext()) {
				Map<String, String> map = new HashMap<String, String>();
				map.put("number", c.getString(c.getColumnIndex("address")));
				map.put("body", c.getString(c.getColumnIndex("body")));
				map.put("type", c.getString(c.getColumnIndex("type")));
				list.add(map);
			}
		}
	}
	

}


你可能感兴趣的:(安卓基础学习4)