CursorLoaderSms。 Loader 实现短信的即时刷新

来源:互联网 发布:软件架构模式 pdf 编辑:程序博客网 时间:2024/05/22 16:56

使用loader加载数据,可以通过配合Activity声明周期,实现数据
的展示的更新。(前提是数据的更新)



Loader 异步装载器
装载器从android3.0开始引进,它使得在activity或fragment中异步加载数据变得简单。
Loader 让未显示的数据的ListView等UI控件先显示,避免出现白屏的现象。,同时在后台下载数据
等下载完成之后再更新ListView组件。


注册表添加:获取短信的读写功能

   <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />



MainActivity.java文件


1.初始化UI控件
public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {

private ListView listView;
private  TextView emptyTextView;

private SimpleCursorAdapter   adapter;

private static final int LOADER_ID=1;

2.绑定UI控件

privtate void init(){
  
   //绑定UI部分
    listView =(ListView)  findViewById(R.id.lv);
     emptyTextView =(TextView) findViewById(R.id.empty_tv);

 3. (绑定适配器) 
  adapter = new SimpleCursorAdapter(MainActivity.this,R.layout.activity_item,null,
   
    new String[]{Sms.ADDRESS,SMs.BODY},new int[]{R.id.address_tv,R.id.body_tv},

    SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

   listView.setAdapter(adapter);

   listView.setEmptyView(emptytextview);

4.加载数据部分

LoaderManager loadermanager =getLoaderManager();
//实现LocaderCallback <Cursor>  接口
loadermanager.initLoader(LOADER_ID,null,this);

}

@Override
 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
    Sms.CONTENT_URI, new String[] {Sms._ID, Sms.ADDRESS, Sms.BODY }, null,
    null, null);
  return cursorLoader;
 }

 @Override
 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  adapter.swapCursor(data);
 }

 @Override
 public void onLoaderReset(Loader<Cursor> loader) {
  adapter.swapCursor(null);
 }

}


import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Telephony.Sms;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
 private ListView listView;
 private TextView emptyTextView;
 private SimpleCursorAdapter adapter;

 private final int LOADER_ID = 1;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  init();
 }

 // 初始化
 private void init() {
  // 初始化UI部分
  listView = (ListView) findViewById(R.id.lv);
  emptyTextView = (TextView) findViewById(R.id.empty_tv);
  adapter = new SimpleCursorAdapter(this, R.layout.layout_item, null,
    new String[] { Sms.ADDRESS, Sms.BODY }, new int[] {
      R.id.address_tv, R.id.body_tv },
    SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
  listView.setAdapter(adapter);
  listView.setEmptyView(emptyTextView);

  // 加载数据部分
  LoaderManager loaderManager = getLoaderManager();
  loaderManager.initLoader(LOADER_ID, null, this);
 }

//第一步:获取LoderManager,并且进行相关初始化操作

//第二步:实现LoaderManager.LoderCallBacks的相关回调接口

//第三步:接口中: 1.创建Loader.
                2.加载完成
                3.加载重置

 @Override
 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
    Sms.CONTENT_URI, new String[] {Sms._ID, Sms.ADDRESS, Sms.BODY }, null,
    null, null);
  return cursorLoader;
 }

 @Override
 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  adapter.swapCursor(data);
 }

 @Override
 public void onLoaderReset(Loader<Cursor> loader) {
  adapter.swapCursor(null);
 }

}


activity_main.xml

<RelativeLayout 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" >

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#ff0000" />
   
    <TextView
        android:id="@+id/empty_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂无数据"
        android:layout_centerInParent="true" />

</RelativeLayout>


activity_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   
    <TextView
        android:id="@+id/address_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="address" />
   
    <TextView
        android:id="@+id/body_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="body"
         />

</LinearLayout>



0 0
原创粉丝点击