Android移動開發基礎教程(慕課版)(第2版)課件 第5單元 數據存儲_第1頁
Android移動開發基礎教程(慕課版)(第2版)課件 第5單元 數據存儲_第2頁
Android移動開發基礎教程(慕課版)(第2版)課件 第5單元 數據存儲_第3頁
Android移動開發基礎教程(慕課版)(第2版)課件 第5單元 數據存儲_第4頁
Android移動開發基礎教程(慕課版)(第2版)課件 第5單元 數據存儲_第5頁
已閱讀5頁,還剩45頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5單元數據存儲Android移動開發基礎教程(慕課版)(第2版)5.1SharedPreferences【知識描述】SharedPreferences用于保存應用程序中少量的數據,例如音樂播放器的播放模式是順序播放還是隨機播放,手機游戲是否打開音效與振動等,這些數據都可以使用SharedPreferences保存。5.1.1SharedPreferences與Editor簡介SharedPreferences提供了一個通用的框架,以便開發者可以以鍵值對的形式將數據持久化。值得注意的是,SharedPreferences只能保存原始的數據類型變量:布爾型變量、浮點型變量、整型變量、長整型變量和字符串變量。MODE_WORLD_WRITEABLE指定創建的文件可以被其他應用程序讀寫MODE_WORLD_READABLE指定創建的文件可以被其他應用程序讀MODE_PRIVATESharedPreferences的默認值,指定創建的文件只能由本應用程序訪問5.1.1SharedPreferences與Editor簡介SharedPreferences接口本身并沒有寫數據能力,這種能力是通過Editor對象實現的,可以通過調用SharedPreferences的edit()方法獲取Editor對象,Editor對外提供了大量寫數據的方法,具體如表5.1所示。方法說明clear()清除SharedPreferences文件中所有的數據commit()Editor完成編輯后,調用該方法提交修改putBoolean(Stringkey,booleanvalue)保存一個布爾型變量putFloat(Stringkey,floatvalue)保存一個浮點型變量putInt(Stringkey,intvalue)保存一個整型變量putLong(Stringkey,longvalue)保存一個長整型變量putString(Stringkey,Stringvalue)保存一個字符串變量remove(Stringkey)從SharedPreferences文件中移除鍵對應的值表5.1Editor提供的寫數據的方法5.1.2SharedPreferences存儲的位置和格式任務5.1使用SharedPreferences讀寫數據本任務在界面上定義了兩個按鈕,單擊其中一個按鈕,向SharedPreferences中寫入一個隨機值;單擊另外一個按鈕,在界面上顯示剛才寫入的數值,運行結果如圖5.1所示。圖5.1使用SharedPreferences讀寫數據5.1.2SharedPreferences存儲的位置和格式【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivity{privateSharedPreferencesmPreferences;//定義一個SharedPreferences對象

@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}privatevoidinit(){//調用getSharedPreferences()方法獲取SharedPreferences的具體實例mPreferences=getSharedPreferences("demosharepreferences",MODE_PRIVATE);ButtonbtnWrite=(Button)findViewById(R.id.btn_write);//獲取“write”按鈕

ButtonbtnRead=(Button)findViewById(R.id.btn_read);//獲取“read”按鈕5.1.2SharedPreferences存儲的位置和格式finalTextViewtxtInfo=(TextView)findViewById(R.id.txt_info);btnWrite.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){SharedPreferences.Editoreditor=mPreferences.edit();//獲取Editor對象

intvalue=newRandom().nextInt(1000);//生成一個隨機數

editor.putInt("random",value);//將隨機數寫入SharedPreferences中

mit();//提交Editor所做的修改

}});btnRead.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){intvalue=mPreferences.getInt("random",0);//調用get×××()方法獲取指定鍵對應的數值

txtInfo.setText("Thenumberis:"+value);//顯示讀取到的數值

} });}}本任務首先調用getSharedPreferences()方法獲取了一個SharedPreferences對象,然后調用editor()方法獲取Editor對象,將生成的隨機數保存到SharedPreferences中。在讀取的時候,調用getXXX()方法獲取指定鍵對應的數值。5.1.2SharedPreferences存儲的位置和格式調用getSharedPreferences()方法不僅會返回一個SharedPreferences對象,還會創建一個文件用于保存數據,該文件存儲在設備的“/data/data/應用包名/shared_prefs”路徑下,打開AndroidStudio的DDMS窗口就可以看到,如圖5.2所示,demoshareprefeces.xml即創建的SharedPreferences文件。圖5.2SharedPreferences文件保存的位置5.2File存儲【知識描述】Android中的文件存儲支持使用Java原生的File類和一些文件流進行訪問,但是Android的存儲規則和其他系統的有所不同,它分為內部存儲和外部存儲。內部存儲位于系統中一個特定的位置,寫入其中的文件不能在應用之間共享,當應用被卸載后,處于內部存儲中的對應文件也被刪除。外部存儲的路徑可以通過Android提供的接口獲取。5.2.1讀寫內部存儲文件在開發中,可以將某應用的文件直接保存在設備的內部存儲空間中。默認地,保存在內部存儲空間中的文件是私有的,其他程序沒有權限訪問該文件。當該應用被卸載時,這些內部存儲的文件也會被移除。內部存儲的文件通過I/O流實現讀寫。Part01FileInputStreamopenFileInput(Stringname)獲取內部存儲中name文件對應的輸入流Part02FileOutputStreamopenFileOutput獲取內部存儲中name文件對應的輸出流,mode指定了打開文件的模式MODE_PRIVATE:該文件只能被當前程序讀寫。MODE_APPEND:以追加的方式打開文件5.2.1讀寫內部存儲文件任務5.2使用內部存儲本任務功能與任務5.1的功能類似,只不過將數據的讀寫方式由使用SharedPreferences改為使用內部存儲。讀寫內部存儲文件的運行結果如圖5.4所示。內部存儲的文件存儲在“/data/data/應用包名/files”路徑下,如圖5.5所示。圖5.4讀寫內部存儲文件的運行結果圖5.5內部存儲保存文件的位置5.2.1讀寫內部存儲文件【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivity{privatefinalStringFILE_NAME="hello";//將文件名定義為常量

protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}privatevoidinit(){ButtonbtnWrite=(Button)findViewById(R.id.btn_write);ButtonbtnRead=(Button)findViewById(R.id.btn_read);finalTextViewtxtInfo=(TextView)findViewById(R.id.txt_info);btnWrite.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){intvalue=newRandom().nextInt(1000);//生成一個隨機值

write(value);//調用write()方法將隨機值寫入內部存儲中5.2.1讀寫內部存儲文件}});btnRead.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){intvalue=read();//調用read()方法從內部存儲中讀取隨機值

txtInfo.setText("Thenumberis:"+value);//顯示

}});}privatevoidwrite(intvalue){try{//獲取輸出流

FileOutputStreamfos=openFileOutput(FILE_NAME,MODE_PRIVATE);fos.write(String.valueOf(value).getBytes());//將數值寫入文件中

fos.close();//關閉流5.2.1讀寫內部存儲文件}catch(Exceptione){e.printStackTrace();}}privateintread(){try{FileInputStreamfis=openFileInput(FILE_NAME);//獲取輸入流

DataInputStreamdis=newDataInputStream(fis);intvalue=dis.readInt();//讀取數值

dis.close();//關閉流

fis.close();returnvalue;}catch(Exceptione){e.printStackTrace();return0;}}}5.2.2讀寫外部存儲文件一般情況下,手機的內部存儲空間有限,如果需要讀寫大文件數據,Android提供了相關訪問外部存儲的方法。讀寫外部存儲文件需要在AndroidManifest.xml文件中配置權限,如下所示:<manifest...><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>...</manifest>5.2.2讀寫外部存儲文件讀寫外部存儲文件的步驟一般如下。調用Environment的getExternalStorageState()方法判斷外部存儲設備是否可用,如果外部存儲設備可讀寫,則Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)返回true調用Environment的getExternalStorageDirectory()方法獲取外部存儲器的目錄010203使用FileInputStream、FileOutputStream、FileWriter、FileReader等流操作文件讀寫外部存儲上的文件5.3SQLite數據庫【知識描述】在應用程序的開發過程中,如果需要存取的數據量比較大,可以考慮使用數據庫。Android系統集成了一個輕量級的數據庫——SQLite。SQLite不像Oracle、SQLServer、MySQL那樣需要單獨安裝,它只是一個文件,操作比較簡單,Android提供了大量的API以支持SQLite讀寫數據。5.3.1SQLiteDatabase簡介SQLiteDatabase代表一個數據庫,應用程序獲取指定數據庫的SQLiteDatabase對象之后,可以調用一系列的方法操作數據庫。方法和對應的說明openDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory,intflags)打開path文件代表的SQLite數據庫openOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)打開path文件代表的SQLite數據庫,如果不存在,則創建execSQL(Stringsql)執行SQL(StructureQueryLanguage,結構查詢語言)語句execSQL(Stringsql,Object[]bindArgs)執行帶占位符的SQL語句insert(Stringtable,StringnullColumnHack,ContentValuesvalues)向表中插入一條數據delete(Stringtable,StringwhereClause,String[]whereArgs)刪除表中指定的數據表5.2SQLiteDatabase類中一些常用的方法5.3.1SQLiteDatabase簡介update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)更新表中指定的數據query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)按一定條件查詢表中的數據query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)按一定條件查詢表中的數據,并且控制查詢的個數。多用于分頁rawQuery(Stringsql,String[]selectionArgs)執行帶占位符的查詢語句beginTransaction()開始一個事務setTransactionSuccessful()設置當前的事務為成功endTransaction()結束一個事務5.3.2創建數據庫和表任務5.3創建表,存儲學生的考試成績【任務代碼】DBHelper代碼:publicclassDBHelperextendsSQLiteOpenHelper{privatestaticfinalintDB_VERSION=1;//數據庫版本號

privatestaticfinalStringDB_NAME="student.db";//數據庫名稱

privatestaticfinalStringTABLE_NAME="score";//創建的表的名稱

publicDBHelper(Contextcontext)//接收Context參數的構造方法

{super(context,DB_NAME,null,DB_VERSION);//調用父類構造方法創建數據庫

}publicvoidonCreate(SQLiteDatabasedb){//數據庫第一次被創建時會回調onCreate()Stringsql="createtableifnotexists"+TABLE_NAME+"(stuNotextprimarykey,stuNametext,stuSextext,stuScoreinteger)";//創建表的語句

db.execSQL(sql);//執行創建表的SQL語句

}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){}}5.3.2創建數據庫和表本任務定義了一個DBHelper類,它繼承自SQLiteOpenHelper,調用父類的構造方法super(context,DB_NAME,null,DB_VERSION)會自動創建名為DB_NAME的數據庫,數據庫第一次被創建時會回調onCreate()方法,可以在其中執行創建表的操作,創建的數據庫存儲在“/data/data/應用包名/databases”路徑下,如圖5.6所示。圖5.6SQLite數據庫保存的位置5.3.3操作SQLite常用類任務5.4訪問SQLite數據庫,修改學生成績表本任務在界面上定義4個按鈕,它們分別用于觸發增加數據、刪除數據、修改更新數據、查詢數據的操作,運行結果如圖5.7所示。圖5.7觸發訪問數據庫操作的4個按鈕5.3.3操作SQLite常用類【任務代碼】MainActivity代碼:publicclassMainActivityextendsActivityimplementsOnClickListener{privateDBMgrmDBMgr=null;//用于封裝對SQLite數據庫的訪問操作

protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}privatevoidinit(){mDBMgr=newDBMgr(this);//初始化

ButtonbtnAdd=(Button)findViewById(R.id.btn_add);//定義4個按鈕

ButtonbtnDelete=(Button)findViewById(R.id.btn_delete);ButtonbtnUpdate=(Button)findViewById(R.id.btn_update);ButtonbtnQuery=(Button)findViewById(R.id.btn_query);btnAdd.setOnClickListener(this);btnDelete.setOnClickListener(this);btnUpdate.setOnClickListener(this);btnQuery.setOnClickListener(this);}5.3.3操作SQLite常用類publicvoidonClick(Viewv){switch(v.getId()){caseR.id.btn_add://增加數據

{Studentstu1=newStudent("201701","aaa","男",95);Studentstu2=newStudent("201702","aaa","女",99);Studentstu3=newStudent("201703","aaa","男",97);List<Student>list=newArrayList<Student>();list.add(stu1);list.add(stu2);list.add(stu3);mDBMgr.add(list);break;}caseR.id.btn_delete: //刪除數據

{mDBMgr.delete("201703");break;}5.3.3操作SQLite常用類caseR.id.btn_update://修改數據

{mDBMgr.update("201701",90);break;}caseR.id.btn_query: //查詢數據

{List<Student>list=mDBMgr.query();for(Studentstu:list){Log.i("Student",stu.toString());}break;}default:break;}}protectedvoidonDestroy(){mDBMgr.finish();//資源回收工作

super.onDestroy();}}5.3.3操作SQLite常用類DBMgr代碼:publicclassDBMgr{privateSQLiteDatabasemDB=null;//定義一個SQLiteDatabase對象

/***構造函數,做一些初始化工作*@paramcontext*/publicDBMgr(Contextcontext){DBHelperhelper=newDBHelper(context);mDB=helper.getWritableDatabase();//獲取一個SQLiteDatabase類的實例

}/***關閉數據庫操作*/publicvoidfinish(){if(null!=mDB){mDB.close();mDB=null;}5.3.3操作SQLite常用類

}/***向數據庫中添加數據*@paramstudents*/publicvoidadd(List<Student>students){if(null==students||students.isEmpty()){return;}for(Studentstu:students){ContentValuesvalues=newContentValues();values.put("stuNo",stu.getStuNo());values.put("stuName",stu.getStuName());values.put("stuSex",stu.getStuSex());values.put("stuScore",stu.getStuScore());mDB.insert("score",null,values);//執行添加操作

}}

/***刪除指定學號的學生信息*@paramstuNo學生學號*/publicvoiddelete(StringstuNo){mDB.delete("score","stuNo=?",newString[]{stuNo});}/***更新指定學號的學生考試成績*@paramstuNo學生學號*@paramscore學生考試成績*/publicvoidupdate(StringstuNo,intscore){Stringsql="updatescoresetstuScore="+score+"wherestuNo="+stuNo;mDB.execSQL(sql);}/***查詢所有學生信息5.3.3操作SQLite常用類*@return返回查詢結果*/publicList<Student>query(){List<Student>list=newArrayList<Student>();//執行查詢語句

Cursorcursor=mDB.query("score",null,null,null,null,null,null);while(cursor.moveToNext())//遍歷查詢結果

{Studentstu=newStudent();stu.setStuNo(cursor.getString(cursor.getColumnIndex("stuNo")));stu.setStuName(cursor.getString(cursor.getColumnIndex("stuName")));stu.setStuSex(cursor.getString(cursor.getColumnIndex("stuSex")));stu.setStuScore(cursor.getInt(cursor.getColumnIndex("stuScore")));list.add(stu);}returnlist;}}5.3.3操作SQLite常用類01OPTION查詢操作調用表5.2所示的query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)方法,這里需要查詢所有數據,所以除了第一個參數傳入表的名稱之外,其他參數均傳入null。查詢結果是一個Cursor對象,Cursor類似于一個集合,可以遍歷取出其中的數據。5.3.3操作SQLite常用類添加操作調用表5.2所示的insert(Stringtable,StringnullColumnHack,ContentValuesvalues)方法,數據以鍵值對的形式保存在ContentValues對象中,然后被插入表中,插入數據后的查詢結果如圖5.8所示。02OPTION圖5.8SQLite插入數據后的查詢結果5.3.3操作SQLite常用類修改操作調用表5.2所示的update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)方法,更新表中指定的數據,更新數據后的結果如圖5.9所示,將學號為202401的學生的考試成績改為了90分。圖5.9SQLite更新數據后的結果03OPTION5.3.3操作SQLite常用類刪除操作調用表5.2所示的delete(Stringtable,StringwhereClause,String[]whereArgs)方法,將學號為202403的學生的數據刪除,刪除數據后的結果如圖5.10所示。圖5.10SQLite刪除數據后的結果04OPTION5.3.4事務在數據庫中,事務是指一系列操作的集合,這些操作要么全部成功執行,要么全部不執行。一個典型的例子是銀行的轉賬工作,它包含兩個操作:(1)從一個賬戶扣款;(2)另一個賬戶增加相應的金額。很明顯,這兩個操作必須全部成功執行或者全部不執行。SQLite數據庫對事務的概念也做了相應的支持,在操作的開始調用beginTransaction()開啟一個事務,當一系列的操作完成后,調用setTransactionSuccessful()函數將事務設置為成功,最后調用endTransaction()結束一個事務。5.4項目實戰項目5-1持久化RSS源首先定義一個SQLiteHelper類,它繼承自SQLiteOpenHelper,用于創建對應的數據庫和數據表SQLiteHelper代碼:publicclassSQLiteHelperextendsSQLiteOpenHelper{privatestaticfinalintDB_VERSION=1;privatestaticfinalStringDB_NAME="rss.db";//數據庫名

privatestaticfinalStringTABLE_NAME="source";//數據表名

publicSQLiteHelper(Contextcontext){super(context,DB_NAME,null,DB_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasesqLiteDatabase){Stringsql="CREATETABLEIFNOTEXISTS"+TABLE_NAME+"(\n"+"idINTEGERPRIMARYKEYAUTOINCREMENT,\n"+"nametext,\n"+"urltext,\n"+"create_timetext)";sqLiteDatabase.execSQL(sql);}@OverridepublicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,inti,inti1){}}5.4項目實戰接著,創建一個PersistMgr類用于訪問數據庫并對其中的數據做增加、刪除和查詢操作PersistMgr代碼:publicclassPersistMgr{privateSimpleDateFormatdf;privateSQLiteDatabasemDB=null;publicPersistMgr(Contextcontext){SQLiteHelperhelper=newSQLiteHelper(context);mDB=helper.getWritableDatabase();df=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");}publicvoidfinish(){if(null!=mDB){mDB.close();mDB=null;}}5.4項目實戰publicvoidaddRSSSource(RSSSourcesource){if(null==source){return;}ContentValuesval=newContentValues();val.put("name",source.getName());val.put("url",source.getUrl());val.put("create_time",df.format(newDate()));mDB.insert("source",null,val);}publicvoiddelete(Stringurl){mDB.delete("source","url=?",newString[]{url});}5.4項目實戰publicList<RSSSource>query(){List<RSSSource>result=newArrayList<>();try(Cursorcursor=mDB.query("source",null,null,null,null,null,null,null)){while(cursor.moveToNext()){RSSSourcesource=newRSSSource(cursor.getString(cursor.getColumnIndex("name")),cursor.getString(cursor.getColumnIndex("url")));result.add(source);}}returnresult;}}5.4項目實戰最后,改寫RSSSourceRepository類,調用PersistMgr類的方法,將對RSS源的操作持久化到SQLite數據庫中,在應用退出并重新啟動后,仍然可以讀取之前保存的RSS源信息RSSSourceRepository代碼:publicclassRSSSourceRepository{privateList<RSSSource>sources;privatePersistMgrpersistMgr;privateIRSSSourceChangeCallbackcallback;publicRSSSourceRepository(){this.sources=newArrayList<>();}publicvoidsetContext(Contextcontext){this.persistMgr=newPersistMgr(context);}publicvoidsetCallback(IRSSSourceChangeCallbackcallback){this.callback=callback;}5.4項目實戰publicList<RSSSource>getSources(){this.sources=this.persistMgr.query();returnsources;}publicvoidaddSources(StringsourceName,StringsourceUrl){persistMgr.addRSSSource(newRSSSource(sourceName,sourceUrl));}publicvoidremoveSourceByUrl(StringsourceUrl){Iterator<RSSSource>iterator=this.sources.iterator();while(iterator.hasNext()){if(sourceUrl.equalsIgnoreCase(iterator.next().getUrl())){iterator.remove();this.callback.onChanged();break;}}this.persistMgr.delete(sourceUrl);}publicvoidfinish(){this.persistMgr.finish();}}5.4項目實戰項目5-2文件瀏覽器首頁首先獲取系統外部存儲的根目錄,然后通過ListView控件列表展示。當單擊某個文件夾時,獲取單擊文件夾的文件路徑,通過listFiles()方法獲取該路徑下的子文件,并根據自定義的比較器對結果進行排序,然后更新ListView的數據,更新顯示內容,具體代碼如下。圖5.11文件列表圖5.12下級目錄5.4項目實戰MainActivity代碼:publicclassMainActivityextendsActivity{privateListViewAdaptermAdpter;privateTextViewmTitle;privateFileMgrfileMgr;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用于顯示當前文件的路徑

mTitle=(TextView)findViewById(R.id.txt_view);//獲取ListView控件

ListViewListView=(ListView)findViewById(R.id.list_view);//自定義AdaptermAdpter=newListViewAdapter(this);init();5.4項目實戰ListView.setAdapter(mAdpter);ListView.setOnItemClickListener(newOnItemClickListener(){publicvoidonItemClick(AdapterView<?>parent,Viewview,intpos,longid){//獲取當前選擇的文件

Filefile=mAdpter.getItem(pos);//更新顯示下級目錄

change(file);}});}

privatevoidinit(){fileMgr=newFileMgr();//判斷外部存儲是否可用

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){Toast.makeText(this,"theexternalstorageisnotavailable",Toast.LENGTH_SHORT).show();return;}5.4項目實戰FilerootFile=Environment.getExternalStorageDirectory();mTitle.setText(rootFile.getAbsolutePath());//獲取當前目錄的子文件列表

List<File>files=fileMgr.getSubFiles(rootFile);mAdpter.updateFiles(files);}privatevoidchange(Filefile){if(!file.isDirectory())//如果不是文件夾,直接返回

{return;}//更新路徑的顯示

mTitle.setText(file.getAbsolutePath());//獲取新的文件列表

List<File>files=fileMgr.getSubFiles(file);//更新文件和視圖顯示

mAdpter.updateFiles(files);mAdpter.notifyDataSetChanged();}}5.4項目實戰在MainActivity中,首先根據Environment.getExternalStorageState()方法判斷外部存儲是否可用,如果可用,獲取外部存儲的根目錄,然后調用文件管理類FileMgr的方法獲取子文件列表,將文件列表設置到ListView自定義的Adapter中。在onCreate()方法中,對ListView的item設置了單擊的監聽事件,當item被單擊后,獲取對應的文件對象。如果該文件屬于文件夾,則獲取子目錄,并調用Adapter的notifyDataSetChanged()方法更新文件和視圖顯示。5.4項目實戰ListViewAdapter代碼:publicclassListViewAdapterextendsBaseAdapter{privateLayoutInflaterflater;privateList<File>mDatas;publicListViewAdapter(Contextcontext){flater=LayoutInflater.from(context);mDatas=newArrayList<File>();}publicvoidupdateFiles(List<File>files){mDatas.clear();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論