当前位置:  编程技术>移动开发
本页文章导读:
    ▪简略使用SimpleCursorAdapter        简单使用SimpleCursorAdapter 如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子.........
    ▪ 插件征集        插件收集 http://code.google.com/p/android-application-plug-ins-frame-work/http://hangxin1940.cnblogs.com/http://my.oschina.net/eclipse88/blog/78872解决Android解析图片的OOM问题!!!http://my.eoe.cn/863210/archive/927.html ......
    ▪ 自定义列表对话框(1)       自定义列表对话框(一)dialog.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_paren.........

[1]简略使用SimpleCursorAdapter
    来源: 互联网  发布时间: 2014-02-18
简单使用SimpleCursorAdapter

来自:http://www.apkbus.com/android-16354-1-1.html

 

如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子类SimpleCursorAdapter。

以下就介绍一下使用sqlite+content provider+cursor adapter的最简单实现示例。太简单了,示例如图:

 

 

首先,要有个Content provider,如不了解如何实现,请参考编写最简单的Content Provider和在Content provider实现中使用SQLiteOpenHelper,下面写的是结合二者的:

 

  • public class RiverContentProvider extends ContentProvider {
  •  
  •     public static final Uri CONTENT_URI = Uri 
  •             .parse("content://com.easymorse.cp.rivers");
  •  
  •     public static final String _ID = "_id";
  •  
  •     public static final String NAME = "name";
  •  
  •     public static final String LENGTH = "length";
  •  
  •     private static SQLiteDatabase database;
  •  
  •     private static final int DATABASE_VERSION = 2;
  •  
  •     private static final List<River> RIVERS = new ArrayList<River>();
  •  
  •     static { 
  •         River river = new River("长江", 6380); 
  •         RIVERS.add(river);
  •  
  •         river = new River("黄河", 5464); 
  •         RIVERS.add(river); 
  •     }
  •  
  •     @Override 
  •     public int delete(Uri uri, String selection, String[] selectionArgs) { 
  •         // TODO Auto-generated method stub 
  •         return 0; 
  •     }
  •  
  •     @Override 
  •     public String getType(Uri uri) { 
  •         // TODO Auto-generated method stub 
  •         return null; 
  •     }
  •  
  •     @Override 
  •     public Uri insert(Uri uri, ContentValues contentValues) { 
  •         // TODO Auto-generated method stub 
  •         return null; 
  •     }
  •  
  •     @Override 
  •     public boolean onCreate() { 
  •         database = new RiverDatabaseHelper(getContext(), "rivers", null, 
  •                 DATABASE_VERSION).getReadableDatabase(); 
  •         return database != null; 
  •     }
  •  
  •     @Override 
  •     public Cursor query(Uri uri, String[] projection, String selection, 
  •             String[] selectionArgs, String sortOrder) { 
  •         return database.query("rivers", projection, selection, selectionArgs, 
  •                 null, null, sortOrder); 
  •     }
  •  
  •     @Override 
  •     public int update(Uri uri, ContentValues values, String selection,
  •             String[] selectionArgs) { 
  •         // TODO Auto-generated method stub 
  •         return 0; 
  •     }
  •  
  •     private static class RiverDatabaseHelper extends SQLiteOpenHelper {
  •  
  •         public RiverDatabaseHelper(Context context, String name, 
  •                 CursorFactory factory, int version) { 
  •             super(context, name, factory, version); 
  •         }
  •  
  •         @Override 
  •         public void onCreate(SQLiteDatabase database) { 
  •             database.execSQL("create table if not exists rivers(" 
  •                     + " _id integer primary key autoincrement," + " name text," 
  •                     + "length integer" + ");");
  •  
  •             SQLiteStatement statement = database 
  •                     .compileStatement("insert into rivers(name,length) values(?,?)");
  •  
  •             for (River r : RIVERS) { 
  •                 int index = 1; 
  •                 statement.bindString(index++, r.getName()); 
  •                 statement.bindLong(index++, r.getLength()); 
  •                 statement.executeInsert(); 
  •             }
  •  
  •             statement.close(); 
  •         }
  •  
  •         @Override 
  •         public void onUpgrade(SQLiteDatabase database, int oldVersion, 
  •                 int newVersion) { 
  •             database.execSQL("drop table if exists rivers"); 
  •             onCreate(database); 
  •         }
  •  
  •     }
  • 复制代码

    这里写的很简略,没用到的方法都没实现。在总的布局中使用了ListView:

  • <?xml version="1.0" encoding="utf-8"?> 
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  •     android:orientation="vertical" android:layout_width="fill_parent" 
  •     android:layout_height="fill_parent"> 
  •     <ListView android:id="@+id/riverList" android:layout_width="fill_parent" 
  •         android:layout_height="fill_parent" /> 
  • </LinearLayout>
  • 复制代码

    使用了自定义的ListView布局,见:

  • <?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="wrap_content"> 
  •     <TextView android:id="@+id/riverName" android:layout_width="match_parent" 
  •         android:layout_height="wrap_content" /> 
  • </LinearLayout>
  • 复制代码

    最后是在Activity中使用contentprovider查询的cursor,生成ListView:

  • public class ListViewActivity extends Activity {
  •     private ListView riverListView;
  •     /** Called when the activity is first created. */ 
  •     @Override 
  •     public void onCreate(Bundle savedInstanceState) { 
  •         super.onCreate(savedInstanceState); 
  •         setContentView(R.layout.main);
  •         setRiverListViewAdapter(); 
  •     }
  •     private void setRiverListViewAdapter() { 
  •         riverListView = (ListView) this.findViewById(R.id.riverList);
  •         Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null, 
  •                 null, null, null); 
  •         CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, 
  •                 cursor, new String[] { RiverContentProvider.NAME }, 
  •                 new int[] { R.id.riverName }); 
  •         riverListView.setAdapter(adapter); 
  •     } 
  • }
  • 复制代码

    源代码见: <ignore_js_op > SimpleCursorAdapter(安卓巴士源码).rar (51.69 KB, 下载次数: 63)

     

    来自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=54757

         在许多时候需要将数据库表中的数据显示在ListView、Gallery等组件中。虽然可以直接使用Adapter对象处理,但工作量很大。为此,Android SDK提供了一个专用于数据绑定的Adapter类:SimpleCursorAdapter。
        SimpleCursorAdapter与SimpleAdapter用法相近。只是将List对象换成了Cursor对象。而且SimpleCursorAdapter类构造方法的第四个参数from表示Cursor对象中的字段,而SimpleAdapter类构造方法的第四个参数from表示Map对象中的key。除此之外,这两个Adapter类在使用方法完全相同。
        下面是SimpleCursorAdapter类构造方法定义。
         public SimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to);
        下例中通过SimpleCursorAdapter类将数据库表绑定在ListView上,也就是说,该ListView会显示数据表的全部记录。在绑定数据前,需要先编写一个SQLiteOpenHelper类的子类,用于操作数据库,代码如下:

      package com.li;
    
    import java.util.Random;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DBService extends SQLiteOpenHelper {
    
            private final static int DATABASE_VERSION = 1;
            private final static String DATABASE_NAME = "test.db";
    
            public DBService(Context context) {
                    super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                     //创建表          
                    String sql = "CREATE TABLE [t_test](" + "[_id]AUTOINC,"
                                    + "[name]VARCHAR2(20) NOT NULL CONFLICT FAIL,"
                                    + "CONSTRAINT[sqlite_autoindex_te_test_1]PRIMARY KEY([_id]))";
                    db.execSQL(sql);
                    //向test数据库中插入20条记录
                    Random random = new Random();
                    for ( int i = 0;i<20;i++)
                    {
                            String s = "";
                            for(int j=0;j<10;j++)
                            {
                                    char c = (char)(97+random.nextInt(26));
                                    s+=c;
                            }
                            db.execSQL("insert into t_test(name)values(?)",new Object[]{s});
                                            
                    }
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
            }
    
            //执行查询语句
            public Cursor query(String sql,String[] args)
            {
                    SQLiteDatabase db = this.getReadableDatabase();
                    Cursor cursor = db.rawQuery(sql, args);
                    return cursor;
            }
    
    }

     
          本例不需要对test.db进行升级,因此,只有在DBService类中的oncreate()方法中有创建数据库表的代码。DBService类创建了一个test.db数据库文件,并在该文件中创建了t_test表。在该表中包含两个字段_id和name。其中_id是自增字段,并且是主索引。
         下面编写MapsDemo类。MapsDemo类是ListActivity的子类。在该类中的oncreate()方法中创建了DBService对象,然后通过DBService类的query方法查询出t_test表中的所有记录,并返回Cursor对象。MapsDemo类的代码如下:

          package com.li;
         import android.app.ListActivity;
        import android.database.Cursor;
        import android.os.Bundle;
        import android.widget.SimpleCursorAdapter;
        public class MapsDemo extends ListActivity {
    
        /** Called when the activity is first created. */
        @Override
         public void onCreate(Bundle savedInstanceState) 
        {
             super.onCreate(savedInstanceState);
             DBService dbService = new DBService(this);
    
             //查询数据         
             Cursor cursor = dbService.query("select * from t_test", null);
    
             //绑定数据
             SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter   (this,android.R.layout.simple_expandable_list_item_1,cursor,new String[]{"name"},new int[]{android.R.id.text1});
             setListAdapter(simpleCursorAdapter);
    }
    
    }

     
           SimpleCursorAdapter类构造方法的第四个参数表示返回Cursor对象中的字段名,第五个参数表示要将该字段的值赋给那个组件。该组件在第二个参数中指定的布局文件中定义。

         注意:在绑定数据时,Cursor对象返回的记录集中必须包含一个叫"_id"的字段,否则将无法完成数据绑定。也就是说SQL语句不能是select name from t_contacts.如果在数据表中没有"_id"字段,可以采用其他方法来处理。
         读到这里可能有人要问:数据存到哪里去了?系统在手机内存中的/data/data/<package name>/databases目录中创建数据库文件。


        
    [2] 插件征集
        来源: 互联网  发布时间: 2014-02-18
    插件收集
    http://code.google.com/p/android-application-plug-ins-frame-work/

    http://hangxin1940.cnblogs.com/


    http://my.oschina.net/eclipse88/blog/78872


    解决Android解析图片的OOM问题!!!
    http://my.eoe.cn/863210/archive/927.html

        
    [3] 自定义列表对话框(1)
        来源: 互联网  发布时间: 2014-02-18
    自定义列表对话框(一)

    dialog.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:background="@android:color/white"
        android:orientation="vertical" >
    <ListView 
        android:id="@+id/listView"
        android:layout_width="270dip"
        android:layout_height="match_parent"
        >
    </ListView>
    
    </LinearLayout>


    listview_item.xml如下:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center"
        android:paddingLeft="6dip"
        android:minHeight="?android:attr/listPreferredItemHeight"
        android:textSize="15dip"
    />


    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"
        tools:context=".MainActivity" >
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="自定义列表对话框" 
        />
    
    
    </RelativeLayout>

     

    styles.xml如下:

    <resources>
        <style name="AppBaseTheme" parent="android:Theme.Light"></style>
        <style name="AppTheme" parent="AppBaseTheme">
        </style>
    
        <style name="dialog" parent="@android:style/Theme.Dialog">
            <item name="android:windowFrame">@null</item>
            <item name="android:windowIsFloating">true</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:backgroundDimEnabled">true</item>
            <item name="android:windowContentOverlay">@null</item>
        </style>
    
    </resources>


    mainActivity如下:

    package c.c.testdialog;
    import android.app.Activity;
    import android.app.Dialog;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.TextView;
    /**
     * Demo描述:
     * 自定义列表对话框(自定义View中采用ListView)
     * 该例比自定义列表对话框(二)的代码和效果都要好
     * 遇到的问题:
     * 自定义对话框有黑色边框
     * 解决办法:
     * 设置样式(style)
     * 参考资料:
     * http://april19880317.blog.51cto.com/1938095/690380
     */
    public class MainActivity extends Activity {
       private Button mButton;
       private View mDialogView;
       private Dialog mDialog;
       private ListView mListView;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		init();
    	}
    	private void init(){
    		mButton=(Button) findViewById(R.id.button);
    		mButton.setOnClickListener(new ClickListenerImpl());
    	}
    	private class ClickListenerImpl implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			switch (v.getId()) {
    			case R.id.button:
    				// 弹出自定义对话框
    				showDialog();
    				break;
    			default:
    				break;
    			}
    
    		}
    	}
    	private void showDialog(){	
    		String[] items = new String[] { "发送电子邮件", "分享到Twitter", "分享到FaceBook"}; 	
    		LayoutInflater  layoutInflater=(LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    		mDialogView=layoutInflater.inflate(R.layout.dialog, null);
    		mListView=(ListView) mDialogView.findViewById(R.id.listView);
    		ArrayAdapter<String> adapter=
    		new ArrayAdapter<String>(MainActivity.this, R.layout.listview_item,items); 
    		mListView.setAdapter(adapter);
    		mListView.setOnItemClickListener(new OnItemClickListener() {
    			@Override
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
    				switch (arg2) {
    				case 0:
                    System.out.println("------> 发送电子邮件");
                    mDialog.dismiss();
    					break;
    				case 1:
    				System.out.println("------> 分享到Twitter");
    				mDialog.dismiss();
    					break;
    				case 2:
    				System.out.println("------> 分享到FaceBook");
    				mDialog.dismiss();
    					break;
    				default:
    					break;
    				}
    
    			}
    		});
    		mDialog=new Dialog(MainActivity.this, R.style.dialog);
    		mDialog.setContentView(mDialogView);
    		mDialog.show();
    	
    	}
    }
    



     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3