日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android-入门学习笔记-使用 CursorLoader 加载数据

發布時間:2023/11/29 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android-入门学习笔记-使用 CursorLoader 加载数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3

使用這個代碼片段開始練習

也可以參考?Codepath 教程


高級內容補充:

你是否在思考ArrayAdapter’s 的 getView() 方法和CursorAdapter 的 newView() 和 bindView() 方法?

你可以查看?CursorAdapter 類的源碼. getView() 方法依然存在, 但是它實際根據是否存在列表項能夠被循環使用,來決定調用 newView() 或 bindView(),如果 convertView 為空,那么我們需要創建新的列表項,如果 convertView 不為空,那么我們可以循環使用舊的列表項。

因此,作為一個開發者,我們不需要重載 CursorAdapter 的 getView() 方法. 我們可以僅僅重載 newView() 和 bindView() 方法, 剩下的工作交給適配器來完成!

4

空視圖是在 ListView 中無項目時展示的視圖。在沒有數據的情況下不是在應用中展示一個空白屏幕,而是通過有吸引力的圖像或描述性文字來提升用戶體驗。 文字甚至可以提示用戶添加一些數據。

在我們的 Pets 應用中,我們想要在 ListView 中沒有要顯示的寵物時,設置以下空視圖。

設置空視圖非常簡單。

第 1 步:在 ListView 旁邊創建空視圖

首先在你的布局中創建空視圖。在我們的案例中,應該有兩個 TextViews 和一個 ImageView,像這樣對齊。并給空視圖一個 id“@+id/empty_view”,以便我們之后在 Java 代碼中引用。

<red lines><!-- Empty view for the list --><RelativeLayout android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"> <ImageView android:id="@+id/empty_shelter_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/ic_empty_shelter"/> <TextView android:id="@+id/empty_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_shelter_image" android:layout_centerHorizontal="true" android:fontFamily="sans-serif-medium" android:paddingTop="16dp" android:text="@string/empty_view_title_text" android:textAppearance="?android:textAppearanceMedium"/> <TextView android:id="@+id/empty_subtitle_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_title_text" android:layout_centerHorizontal="true" android:fontFamily="sans-serif" android:paddingTop="8dp" android:text="@string/empty_view_subtitle_text" android:textAppearance="?android:textAppearanceSmall" android:textColor="#A2AAB0"/> </RelativeLayout>

對于文本,使用 strings.xml 資源文件。

<!-- Title text for the empty view, which describes the empty dog house image [CHAR LIMIT=50] --><string name="empty_view_title_text">It\'s a bit lonely here...</string> <!-- Subtitle text for the empty view that prompts the user to add a pet [CHAR LIMIT=50] --> <string name="empty_view_subtitle_text">Get started by adding a pet</string>

第 2 步:添加空視圖

在創建 ListView 時,你可以使用 id 指定一個空視圖。使用我們之前設置的 id,用 findViewById() 方法獲取視圖,然后使用 ListView 的 setEmptyView() 方法設置空視圖。

// Find the ListView which will be populated with the pet data ListView petListView = (ListView) findViewById(R.id.list);// Find and set empty view on the ListView, so that it only shows when the list has 0 items. View emptyView = findViewById(R.id.empty_view);petListView.setEmptyView(emptyView);

第 3 步:測試

刪除數據或卸載并重裝應用,使用一個空數據庫啟動。現在,你應該會看到空視圖出現在屏幕上!

練習完成前后的差異。

6

參閱此教程?或此文檔。

提示:添加需要從接口實現的方法的鍵盤快捷鍵:Ctrl + I 提示:將 CursorAdapter 作為全局變量 提示:對于 onLoadFinished() 和 onLoaderReset() 方法,你可以使用 CursorAdapter 的?swapCursor() 方法更改數據源 Cursor。

注:插入新寵物(從虛擬菜單項或編輯器)不會自動更新寵物列表(直到下一個編碼任務前)。你需要強制關閉應用并重新打開它,才能看到寵物列表更新。

如果你在想為什么 projection 需要包含 _id,請參見CursorAdapter 類的描述。CursorAdapter 假設 Cursor 包含一個名為 _id 的列。

7

目前,我們的 CursorLoader 有一個小缺陷,那就是它不會在底層 SQLite 數據庫變化時進行自動更新。

為什么列表之前可以更新,而現在不行?我們返回去看看舊的代碼。

在之前,displayDatabaseInfo 在 onStart() 內及在菜單項被單擊時調用。這可以完全確保數據始終為最新狀態,但它也會在主線程上多次進行不必要的數據加載。

在主線程上進行加載會降低應用的速度,如我們之前所講,而且進行無用的加載更是浪費資源。

那么,它什么時候的數據加載是無用的呢?是這樣,每次當應用被旋轉或你導航到別處一會兒并返回后 onStart 就會被觸發。 如果你旋轉應用或導航到別處并返回后,你真的需要再次從數據庫獲取數據嗎?數據庫中有任何東西發生變化了嗎?答案是沒有,數據庫未發生任何變化,所以你并不需要重新加載數據。

這實際上就是 CursorLoader 主要用于解決的問題之一:我們想追蹤數據是否已加載,且如果已加載,則避免重新加載,除非有必要。

很顯然我們不需要在每次調用 onStart 時重新加載方法。那么我們何時需要重新加載數據呢?

  • 查看答案
  • 提交答案

解答

我們僅需要在 SQLite 數據庫中的某些數據發生變化時更新Cursor。

用戶關閉和重新打開應用、旋轉應用和滾動 ListView 實際上不會更改數據庫中的數據,我們這時就不需要重新加載數據。

8

這個?教程?展示了何時調用notifyChange()

Cursor?setNotificationUri()?方法

?

9

注意:在這里,編輯器尚不會顯示數據庫中特定寵物的數據。這將在之后的步驟中實現。

提示 1:通過?setOnItemClickListener()?方法將 OnItemClickListener 設置到 ListView。

提示 2:創建特定寵物內容 URI,使用?Uri.withAppendedId()?方法。

提示 3:在 AndroidManifest.xml 中,你可以刪除 EditorActivity 活動元素中的?label?屬性,因為應用欄中新寵物和現有寵物情況的活動標題被在 Java 代碼中通過編程方式覆寫了。

10

好的,現在我們的 Editor Activity 中有了寵物的 URI。在此情況下,我們還應從內容提供程序 中加載寵物數據。我們可以使用 CursorLoader 進行加載。

這與我們上次使用 CursorLoader 的區別這次我們不是獲取Cursor并將其放入 CursorAdapter,而是獲取Cursor中的所有項然后使用它們來填充 EditText 字段。

我們使用的步驟大體和之前一樣,只是當我們創建加載器時,URI 將為單個寵物的,而非全部寵物的。

然后我們從 onLoadFinished 中獲得Cursor,這時候我們不是使用 Cursor Adapter,而是更新所有輸入,即包含寵物值的 editTexts 和性別 spinner。

最后在 onLoaderReset 方法中,我們應清除輸入字段。

現在花一些時間來實際操作吧。

你的步驟:

  • 實現加載器回調接口。
  • 初始化加載器。
  • 編寫加載器回調方法 onCreateLoader 的代碼;確保它使用的是單個寵物的 URI。
  • 編寫加載器回調方法 onLoadFinished 的代碼,并使用寵物數據更新輸入。
  • 編寫加載器回調方法 onLoaderReset 的代碼,然后清除輸入字段。
  • 提示 1:當你從加載器收到Cursor結果,記得在開始從中提取列值前,將Cursor移到位置 0。

    提示 2:你可以使用?Spinner?的?setSelection()?方法來設置下拉菜單 Spinner。

    • 查看答案
    • 提交答案

    解答

    首先實現加載器回調,然后使用 Ctrl + I 熱鍵來獲取所有加載器回調方法:

    public class EditorActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    接下來,使用此代碼初始化加載器:

    getLoaderManager().initLoader(EXISTING_PET_LOADER, null, this);

    在 onCreateLoader() 中,我將創建一個新的 CursorLoader,傳入 uri 和 projection。我需要從 onCreate() 獲取 uri,所以我需要將它放在一個名為?mCurrentPetUri?的實例變量:

    /** Content URI for the existing pet (null if it's a new pet) */ private Uri mCurrentPetUri;...@Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { // Since the editor shows all pet attributes, define a projection that contains // all columns from the pet table String[] projection = { PetEntry._ID, PetEntry.COLUMN_PET_NAME, PetEntry.COLUMN_PET_BREED, PetEntry.COLUMN_PET_GENDER, PetEntry.COLUMN_PET_WEIGHT }; // This loader will execute the ContentProvider's query method on a background thread return new CursorLoader(this, // Parent activity context mCurrentPetUri, // Query the content URI for the current pet projection, // Columns to include in the resulting Cursor null, // No selection clause null, // No selection arguments null); // Default sort order }

    當寵物的數據加載到游標后,onLoadFinished() 將被調用。在這里,我首先要將游標移到第一個項的位置。盡快它只有一個項,并從位置 -1 開始。

    // Proceed with moving to the first row of the cursor and reading data from it// (This should be the only row in the cursor)if (cursor.moveToFirst()) {

    然后,我將獲得每個數據項的索引,然后使用所有和 get() 方法抓取實際整數和字符串,以從游標中獲得數據。

    if (cursor.moveToFirst()) {// Find the columns of pet attributes that we're interested inint nameColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_NAME);int breedColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_BREED);int genderColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_GENDER); int weightColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_WEIGHT); // Extract out the value from the Cursor for the given column index String name = cursor.getString(nameColumnIndex); String breed = cursor.getString(breedColumnIndex); int gender = cursor.getInt(genderColumnIndex); int weight = cursor.getInt(weightColumnIndex);

    對于每一個 textView,我將設置適當的文本。

    // Update the views on the screen with the values from the database mNameEditText.setText(name); mBreedEditText.setText(breed); mWeightEditText.setText(Integer.toString(weight));

    對于 Spinner,我將使用一個 switch 語句來使用 setSelection 方法設置它的狀態。

    // Gender is a dropdown spinner, so map the constant value from the database// into one of the dropdown options (0 is Unknown, 1 is Male, 2 is Female).// Then call setSelection() so that option is displayed on screen as the current selection.switch (gender) {case PetEntry.GENDER_MALE: mGenderSpinner.setSelection(1); break; case PetEntry.GENDER_FEMALE: mGenderSpinner.setSelection(2); break; default: mGenderSpinner.setSelection(0); break; }

    練習完成前后的差異

    11

    我們的“編輯寵物”(Edit Pet) 版本頁面缺失一項重大功能,那就是實際編輯寵物。

    目前,當你更改現有寵物的任何值時,并不會更新寵物,而是會保存寵物的一個副本,這并非我們想要的。

    解決方法就是使“編輯寵物”模式更新當前寵物,使“添加寵物”模式插入新寵物。

    這次我們不使用“insertPet”方法,我們將它改名或“重構”為“savePet”。在這里,就像我們之前一樣,你可以判斷 EditorActivity 是“插入”模式還是“編輯”模式。如果為編輯模式,你需要使用內容提供程序 執行一個“更新”操作。

    好的,現在來試一試吧,更新 savePet 方法。完成后,EditActivity 應該不會創建寵物的副本,而是更新現有寵物。在你按下 FAB 按鈕來插入新寵物時,它也應正確執行。在這兩種情況下,你的應用都應顯示 toast 消息。

    提示:如何判斷我們是在“插入新寵物”還是“編輯現有寵物”?你可以在設置 EditorActivity 標題時執行此檢查。

    注意:確保在 strings.xml 文件中聲明 toast 消息的字符串。

    ContentResolver update() 示例。

    • 查看答案
    • 提交答案

    練習完成前后的差異.

    無論你是第一次更新寵物還是創建寵物,你都需要使用 content values 對象。創建它的方式還是跟之前一樣。創建好后,你需要根據是要編輯現有寵物還是插入新寵物來進行不同操作。

    你可以使用設置標題時所用的方法,通過檢查 mCurrentPetUri 是否為空值來區分編輯模式和插入模式。如果為空值,那么就是新寵物,你可以運行此方法中原有的代碼。

    if (mCurrentPetUri == null) {

    如果 uri 不為空值,這意味著你在更新現有寵物。你可以使用 ContentResolver 的 update 方法來更新寵物。你更新的內容的 URI 為 mCurrentPetUri,這會簡化代碼編寫。

    } else {// Otherwise this is an EXISTING pet, so update the pet with content URI: mCurrentPetUri// and pass in the new ContentValues. Pass in null for the selection and selection args// because mCurrentPetUri will already identify the correct row in the database that// we want to modify. int rowsAffected = getContentResolver().update(mCurrentPetUri, values, null, null);

    現在,它會返回已更新的列數。要顯示更新是否成功,我們可以檢查已更新的列數。若為 0,那么更新不成功,則我們可以顯示一條錯誤 toast 消息。若為相反情況,則顯示成功 toast 消息。

    // Show a toast message depending on whether or not the update was successful.if (rowsAffected == 0) {// If no rows were affected, then there was an error with the update.Toast.makeText(this, getString(R.string.editor_update_pet_failed), Toast.LENGTH_SHORT).show(); } else { // Otherwise, the update was successful and we can display a toast. Toast.makeText(this, getString(R.string.editor_update_pet_successful), Toast.LENGTH_SHORT).show(); }

    12

    干得不錯!

    EditorActivity 在編輯模式下的主要功能已完成。

    后續操作

    我們依然需要實現 delete 和解決幾個 bug。例如,當你為插入新寵物而打開 EditorActivity 時,你在沒有輸入任何東西時不小心點了保存按鈕……這時候就會發生崩潰。

    閱讀錯誤消息,我們得知這是因為你沒有為體重輸入數字;基本上是因為它無法將空白值轉換為數字。

    通常情況下,我們應在 UI 中要求用戶在嘗試將寵物信息存入數據庫之前先輸入一些寵物信息。而所有空白值應視為用戶不小心按下保存鍵,而非作為新寵物進行保存。

    你的任務

    你的任務就是解決這個 bug。為此,首先你得檢查輸入是否為空字符串。你可以使用?TextUtils.isEmpty()) 方法來檢查一個字符串是否全由空格或空字符串構成。如果所有的輸入都為空字符串,且根據 GENDER UNKNOWN 消息性別未更新,則 savePet 方法會直接返回但不包含任何內容。

    此外,當你在保存新寵物時沒有提供體重,則寵物的給定體重將為 0,而不會導致應用崩潰。

    提示 1:調用?finish()?方法來終止 activity。

    提示 2:如果輸入字符串為空值或空字符串,TextUtils.isEmpty(String s)?返回 true。

    • 查看答案
    • 提交答案

    解答

    我們要做的所有更改都在 EditorActivity.java 文件中進行,特別是在 savePet() 方法中。

    要解決第一個問題,在我們獲得所有值后但在創建 ContentValues 對象之前,我將添加一個 if 語句來檢查它們是否為空字符串及性別是否為未知。如果是,我將不再執行剩余的方法或插入寵物,而是直接返回。

    if (mCurrentPetUri == null &&TextUtils.isEmpty(nameString) && TextUtils.isEmpty(breedString) &&TextUtils.isEmpty(weightString) && mGender == PetEntry.GENDER_UNKNOWN) {return;}

    在將體重放入 content value 對象之前,我要解決的下一個問題是:如果用戶未指定寵物體重,應將其設為 0,而不是導致崩潰。所以在代碼中,我們將體重的默認值設為 0,然后在用戶輸入體重后,我會將其更改為輸入的整數值。

    // If the weight is not provided by the user, don't try to parse the string into an// integer value. Use 0 by default.int weight = 0;if (!TextUtils.isEmpty(weightString)) { weight = Integer.parseInt(weightString); } values.put(PetEntry.COLUMN_PET_WEIGHT, weight);

    做了這些更改后,應用便不會崩潰,也不會保存完全空白的寵物信息。非常棒!

    練習完成前后的差異

    13

    警告用戶

    你可能注意到了,按下 EditorActivity 的“上一個”(UP) 或“返回”(back) 按鈕會使你離開 EditorActivity,但不會保存你的更改。你想要明確保存數據庫更改的方法,那么我們只在用戶點擊“保存”(Save) 按鈕的時候保存更改。

    那么,當用戶在添加一些編輯時不小心按下“上一個”(UP) 或“返回”(back) 按鈕時會怎樣呢?為避免用戶丟失工作,我們可以跳出一個對話框,警告用戶其在離開編輯器時有未保存的更改。

    下面是聯系人應用中的警告演示。當你輸入新的聯系人信息,然后在未保存的情況下點擊了“上一個”(UP) 按鈕時,你會看到此行為:

    期望的行為

    在我們的應用中,我們所期望的行為是跳出一個對話框,用消息“是否放棄更改并退出編輯”(Discard your changes and quit editing?) 來警告用戶。用戶可以選擇“繼續編輯”(Keep Editing)(即留在此活動)或“放棄”(Discard)(即結束活動)。

    步驟

    第 1 步:監聽是否進行了更改

    第一步是決定什么時候顯示“放棄更改”對話框。這應僅在用戶更改了表格的某一個部分時發生。你可以做的是創建一個名為 mPetHasChanged 的 boolean,如果用戶更新了 pet 表的任何部分則為 true。

    private boolean mPetHasChanged = false;

    你可以添加?OnTouchListener?來檢查是否發生了更改:

    private View.OnTouchListener mTouchListener = new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) { mPetHasChanged = true; return false; } };

    在?onCreate?中:

    mNameEditText.setOnTouchListener(mTouchListener);mBreedEditText.setOnTouchListener(mTouchListener); mWeightEditText.setOnTouchListener(mTouchListener); mGenderSpinner.setOnTouchListener(mTouchListener);

    第 2 步:編寫創建“放棄更改”對話框的方法

    我們在下面編寫一個創建此對話框的方法:

    private void showUnsavedChangesDialog(DialogInterface.OnClickListener discardButtonClickListener) {// Create an AlertDialog.Builder and set the message, and click listeners// for the positive and negative buttons on the dialog.AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage(R.string.unsaved_changes_dialog_msg);builder.setPositiveButton(R.string.discard, discardButtonClickListener);builder.setNegativeButton(R.string.keep_editing, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// User clicked the "Keep editing" button, so dismiss the dialog// and continue editing the pet.if (dialog != null) {dialog.dismiss();}}});// Create and show the AlertDialogAlertDialog alertDialog = builder.create();alertDialog.show(); }

    此代碼使用?AlertDialogBuilder?創建了一個 AlertDialog。此方法接受放棄按鈕的 OnClickListener。我們這樣做是因為點擊“返回”(back) 或“上一個”(up) 的行為略有不同。

    并且注意,我們還使用了很多 R.string,你可以添加這些:

    Discard your changes and quit editing?DiscardKeep Editing

    第 3 步:連接“返回”(Back)按鈕

    這是“返回”按鈕的代碼。你需要覆蓋此活動的正常返回按鈕。如果寵物發生了變化,你建立會關閉當前活動的放棄點擊偵聽器。然后將此偵聽器傳入剛創建的?showUnsavedChangesDialog?方法。

    @Override public void onBackPressed() {// If the pet hasn't changed, continue with handling back button pressif (!mPetHasChanged) {super.onBackPressed();return;}// Otherwise if there are unsaved changes, setup a dialog to warn the user.// Create a click listener to handle the user confirming that changes should be discarded.DialogInterface.OnClickListener discardButtonClickListener =new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {// User clicked "Discard" button, close the current activity.finish();}};// Show dialog that there are unsaved changesshowUnsavedChangesDialog(discardButtonClickListener); }

    第 4 步:連接“上一個”(Up)按鈕

    這里是“上一個”按鈕的代碼。它在?onOptionsItemSelected?方法中。如果寵物發生變化,你建立一個會導航至“上一個”的放棄點擊偵聽器。然后將此偵聽器傳入剛創建的?showUnsavedChangesDialog?方法。

    case android.R.id.home:// If the pet hasn't changed, continue with navigating up to parent activity// which is the {@link CatalogActivity}.if (!mPetHasChanged) {NavUtils.navigateUpFromSameTask(EditorActivity.this);return true;}// Otherwise if there are unsaved changes, setup a dialog to warn the user.// Create a click listener to handle the user confirming that// changes should be discarded.DialogInterface.OnClickListener discardButtonClickListener =new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {// User clicked "Discard" button, navigate to parent activity.NavUtils.navigateUpFromSameTask(EditorActivity.this);}};// Show a dialog that notifies the user they have unsaved changesshowUnsavedChangesDialog(discardButtonClickListener);return true;

    練習完成前后的差異

    有用鏈接:

    要向“返回”(back)按鈕被點擊的情況添加行為,參閱此 StackOverflow 帖子。

    要向“上一個”(Up)按鈕被點擊的情況添加行為,參閱此文章。你還需要向 android.R.id.home 按鈕被點擊的情況添加代碼。

    如何創建 AlertDialog。

    14

    如果寵物還不存在,則無法刪除它

    我們當前的代碼還有一個“問題”,那就是當你處于 EditorActivity 的插入模式時,會在菜單中看到一個“刪除”(Delete) 選項。由于你當前在插入寵物,因此沒有寵物可供刪除,那么這個選項是多余的。

    我們來解決這個問題。我們要刪除“插入模式”中的刪除選項。

    如何選擇運行應用時的菜單

    當你第一次打開活動時,會調用?onCreateOptionsMenu?方法。它會用所有可見的菜單項填充菜單。要更改它,你需要做的是在確定它是一個新寵物后(mPetContentUri 為空值),你要使選項菜單無效。

    所以在 onCreate 中……

    if (mCurrentPetUri == null) {// This is a new pet, so change the app bar to say "Add a Pet"setTitle(getString(R.string.editor_activity_title_new_pet));// Invalidate the options menu, so the "Delete" menu option can be hidden.// (It doesn't make sense to delete a pet that hasn't been created yet.) invalidateOptionsMenu(); } else { //other stuff }

    然后,onPrepareOptionsMenu?會被調用,你可以在它是新寵物時隱藏刪除菜單選項來修改菜單對象。 此操作的代碼如下:

    @Overridepublic boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); // If this is a new pet, hide the "Delete" menu item. if (mCurrentPetUri == null) { MenuItem menuItem = menu.findItem(R.id.action_delete); menuItem.setVisible(false); } return true; }

    練習完成前后的差異

    有用鏈接:

    Android開發文檔:菜單選項

    Stack Overflow 提問:如何改變菜單項

    15

    我們的最后一項重大任務是實現刪除寵物的能力。此功能在應用的兩個地方:第一個是在 EditorActivity 頁面的菜單中,當你更新寵物時會用到。 第二個是在 CatalogActivity 的菜單中,在此處,刪除 (delete) 選項可用于刪除所有寵物,你在測試數據庫時可以使用。

    首先我們來看 EditorActivity 中的 delete 方法。我們已添加了使它僅在“編輯寵物”模式出現的代碼。現在我想要實現的功能是,當我們選擇刪除寵物時,出現一個對話框, 即按下刪除按鈕應出現一條 toast 消息“已刪除寵物”(Pet deleted) ,并從數據庫中刪除寵物。

    我們復制此代碼片段。它包含 tring.xml 的一些新字符串,也包含生成對話框的代碼,位于一個名為“showDeleteConfirmationDialog”的方法和一個空的“deletePet”方法中。

    此對話框有兩個 onClick 偵聽器,一個用于這里顯示的“刪除”(delete) 按鈕,另一個用于這里顯示的“取消”(cancel) 按鈕。Delete 對話框調用空的“deletePet”方法,你需要在這個方法中添加代碼來實際刪除當前寵物。

    你的任務:

    首先,找到代碼中正確的位置,以當你從下拉菜單中選擇“刪除寵物”(Delete Pet) 時,它會打開 DeleteConfirmationDialog。

    接下來,填上deletePet 方法以刪除當前寵物。你應僅在“編輯模式”中刪除寵物。你還應顯示一條 toast 消息,說明是否刪除了寵物,方法和我們之前用 toast 消息表明是否成功更新了寵物一樣。

    ContentResolver delete() 示例

    • 查看答案
    • 提交答案

    解答

    在復制代碼片段后,首先我們要通過在按下刪除按鈕時調用 showDeleteConfirmationDialog 方法來確保觸發它。方法是前往 onOptionsItemSelected 并在 action.delete 下添加對 showDeleteConfirmationDialog 的調用。

    // Respond to a click on the "Delete" menu optioncase R.id.action_delete:// Pop up confirmation dialog for deletionshowDeleteConfirmationDialog();

    showDeleteConfirmationDialog 會創建一個對話框,在刪除按鈕被按下時調用 deletePet。首先,我確保我們是對現有寵物執行刪除。因為對數據庫中尚不存在的新寵物執行刪除是沒有意義的。所以我檢查是否存在現有寵物(mCurrentPetUri 是否等于 null)。然后使用 content resolver 和當前的寵物 uri 刪除寵物。

    /*** Perform the deletion of the pet in the database.*/ private void deletePet() {// Only perform the delete if this is an existing pet.if (mCurrentPetUri != null) { // Call the ContentResolver to delete the pet at the given content URI. // Pass in null for the selection and selection args because the mCurrentPetUri // content URI already identifies the pet that we want. int rowsDeleted = getContentResolver().delete(mCurrentPetUri, null, null);

    delete 方法和 update 方法一樣,會返回被刪除的行數。我可以通過檢查被刪除的行數是否為 0 來確定刪除成功與否。若為 0,則刪除失敗,我會顯示一條 toast 消息,說明“刪除寵物時出錯”(Error with deleting pet)。 否則,操作將是成功的,且我跳出一條 toast 消息說“寵物已刪除”(Pet deleted)。

    // Show a toast message depending on whether or not the delete was successful.if (rowsDeleted == 0) {// If no rows were deleted, then there was an error with the delete.Toast.makeText(this, getString(R.string.editor_delete_pet_failed), Toast.LENGTH_SHORT).show(); } else { // Otherwise, the delete was successful and we can display a toast. Toast.makeText(this, getString(R.string.editor_delete_pet_successful), Toast.LENGTH_SHORT).show(); }

    完成操作后,調用 finish() 方法關閉此 activity。

    // Close the activityfinish();

    到此,我們就能成功從 EditorActivity 中刪除寵物了!

    練習完成前后的差異.

    16

    現在,我要你添加當用戶從 CatalogActivity 上的溢出菜單點擊“刪除所有寵物”(Delete All Pets) 選項時,用于刪除所有寵物的代碼。無需添加確認消息,但是如果你想,也可以自行實現。

    完成后,菜單看起來應該是這樣的:

    這里的變更較小,所以我就不多做講解,由你自己來完成。

    Android 中的?菜單選項。

    • 查看答案
    • 提交答案

    解答

    對于此練習,我們在 CatalogActivity.java 文件中進行。

    此菜單按鈕與 R.id.action_delete_all_entries 關聯,所以在 onOptionsMenuSelected 方法的該 case 下,我將添加對名為“deleteAllPets()”方法的調用。

    case R.id.action_delete_all_entries:deleteAllPets();return true;

    然后在該方法中,我將使用 ContentResolver 的 delete 方法,并傳入PetEntry.CONTENT_URI。為什么要用內容 URI?因為這是一個一般?__/pets uri,在我們的 內容提供程序中將刪除所有寵物。

    /*** Helper method to delete all pets in the database.*/ private void deleteAllPets() {int rowsDeleted = getContentResolver().delete(PetEntry.CONTENT_URI, null, null); Log.v("CatalogActivity", rowsDeleted + " rows deleted from pet database"); }

    此菜單按鈕與R.id.action_delete_all_entries 關聯,所以在 onOptionsMenuSelected 方法的該 case 下,我將添加對名為“deleteAllPets()”方法的調用。

    練習完成前后的差異.

    17

    對于我們的最后一項更新,你需要解決 UI 中的另一個奇怪的行為。當品種未知時,寵物列表看起來總覺得缺點什么。因為寵物名下就是一片空白。

    在未提供品種信息的情況下,比起留白,顯示一個語句“品種未知”(Unknown breed) 會提供更好的用戶體驗。

    完成此步后應用看起來應該是這個樣子的:

    注意,這只是 CatalogActivity 中的一個 UI 變化,文本“Unknown breed”不應保存在數據庫中。如果你在編輯器中打開此寵物,“品種”(breed) 字段應該是空白的:

    提示:如果輸入字符串為空值或空字符串TextUtils.isEmpty(String s)?將返回 true。

    • 查看答案
    • 提交答案

    解答

    首先,由于我們要添加字符串“Unknown breed”,我們在 strings.xml 文件中保存它。

    <!-- Label for the pet's breed if the breed is unknown [CHAR LIMIT=20] --> <string name="unknown_breed">Unknown breed</string>

    接下來,我們移至 PetCursorAdapter.java 文件。當我們在 CatalogActivity 中顯示寵物時,我們要檢查是否有使用 TextUtils.isEmpty 方法的品種。如果沒有,我們將列表項的 TextView 設為顯示“Unknown breed”。

    In PetCursorAdapter.java:

    /*** This method binds the pet data (in the current row pointed to by cursor) to the given* list item layout. For example, the name for the current pet can be set on the name TextView* in the list item layout.** @param view Existing view, returned earlier by newView() method* @param context app context* @param cursor The cursor from which to get the data. The cursor is already moved to the* correct row.*/ @Override public void bindView(View view, Context context, Cursor cursor) { // Find individual views that we want to modify in the list item layout TextView nameTextView = (TextView) view.findViewById(R.id.name); TextView summaryTextView = (TextView) view.findViewById(R.id.summary); // Find the columns of pet attributes that we're interested in int nameColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_NAME); int breedColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_BREED); // Read the pet attributes from the Cursor for the current pet String petName = cursor.getString(nameColumnIndex); String petBreed = cursor.getString(breedColumnIndex); // If the pet breed is empty string or null, then use some default text // that says "Unknown breed", so the TextView isn't blank. if (TextUtils.isEmpty(petBreed)) { petBreed = context.getString(R.string.unknown_breed); } // Update the TextViews with the attributes for the current pet nameTextView.setText(petName); summaryTextView.setText(petBreed); }

    練習完成前后的差異.

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/infocodez/p/8449730.html

    總結

    以上是生活随笔為你收集整理的Android-入门学习笔记-使用 CursorLoader 加载数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    99久久精品无免国产免费 | 成人福利在线播放 | 国产精品久久久久久久毛片 | 午夜电影中文字幕 | 碰超在线| 国产精品9999久久久久仙踪林 | 国产视频在线一区二区 | 久久电影色| 99久热在线精品视频 | 少妇bbbb揉bbbb日本 | 中文字幕久久精品亚洲乱码 | 久久国产影院 | 伊人五月在线 | 中文字幕一区在线 | 999精品视频 | 成人午夜在线观看 | 成人三级av| 美女黄视频免费 | 在线视频麻豆 | 欧美一二三区在线播放 | 国产视频中文字幕 | 国产精品18久久久久久vr | 久草免费色站 | 免费国产在线精品 | 成年人电影免费在线观看 | 国产午夜精品一区二区三区 | 欧美日韩亚洲精品在线 | 国产伦精品一区二区三区无广告 | 久久蜜桃av | 在线免费观看黄色 | 国产成人一区在线 | 欧美日本国产在线观看 | 波多野结衣在线视频一区 | 高清不卡一区二区三区 | 综合久久精品 | 8090yy亚洲精品久久 | 天堂网中文在线 | 国产精品午夜av | 97超碰成人在线 | 婷婷国产精品 | 中文字幕久久精品亚洲乱码 | 在线免费视频 你懂得 | japanesefreesex中国少妇 | 视频在线99re| 久草在线最新 | www,黄视频 | 久久99深爱久久99精品 | 久久国产手机看片 | 色狠狠综合天天综合综合 | 久久这里精品视频 | 亚洲精品国 | 成人动漫视频在线 | 久久欧美视频 | 国产精品黄色影片导航在线观看 | 欧美一区二区三区在线视频观看 | 99热亚洲精品 | 久久久这里有精品 | 亚洲精品观看 | 狠狠插狠狠操 | 久 久久影院 | 波多野结衣视频一区二区三区 | 国产福利在线免费观看 | 在线色亚洲 | 日日干天天 | 日韩在线三区 | 中文字幕在线一区观看 | 亚洲dvd| 国产精品一区在线播放 | 亚洲精品国产精品乱码在线观看 | 久久婷婷一区二区三区 | 久久精品网址 | 亚洲视频 视频在线 | 中文字幕 成人 | 在线电影日韩 | 久草在线视频免费资源观看 | 亚洲专区 国产精品 | 日日干天天插 | 91福利视频免费 | 91看片网址| av电影一区二区三区 | 精品久久久久久久久久久久 | 久久伊人爱 | 欧美日韩一区二区三区不卡 | 青草视频网 | 五月天综合激情网 | 色97在线 | 国产精品爽爽久久久久久蜜臀 | 成人在线免费小视频 | 最近日本中文字幕a | 国产成人精品福利 | 欧美福利精品 | av黄色亚洲 | 欧美一区二区三区免费看 | 日韩午夜一级片 | 国产一级视频在线 | 国模视频一区二区 | 在线中文字幕播放 | 日一日干一干 | 亚洲一本视频 | 成人av片免费观看app下载 | 91视频大全 | 中文字幕在线观看视频一区二区三区 | 欧美在线视频一区二区三区 | 毛片一区二区 | 国产精品福利视频 | 欧美人交a欧美精品 | 久久亚洲热 | 四虎永久网站 | 麻豆va一区二区三区久久浪 | 97在线公开视频 | 亚洲3级 | 日日干天天爽 | 一区二区视频网站 | 精品国产精品久久一区免费式 | 日日夜夜精品视频天天综合网 | 亚洲精品国产品国语在线 | 久久999久久| 免费av成人在线 | 久久字幕精品一区 | 国产欧美综合在线观看 | 免费成人黄色av | 99视频在线观看一区三区 | 国产福利一区在线观看 | 久久免费视频6 | 色视频在线 | 中文字幕免费国产精品 | 国产视频一区二区在线播放 | 亚洲欧洲精品视频 | 久久精品看片 | 国产系列在线观看 | 精选久久 | 视频福利在线观看 | 国产伦精品一区二区三区四区视频 | 伊人狠狠操 | 中日韩欧美精彩视频 | 国产一区在线播放 | 日韩一区二区三区在线观看 | 久久久精品日本 | 最近中文字幕免费观看 | 亚洲精选视频免费看 | 日韩在线观看视频一区二区三区 | 精品国产一区在线观看 | 嫩草av影院 | 亚洲狠狠操 | 久久激情精品 | 久久免费视频一区 | 国产在线a视频 | 国产最新视频在线 | 久久久午夜精品理论片中文字幕 | 国产精品久久久久久久久久三级 | 9热精品 | 日韩国产精品毛片 | 欧美激情视频一二区 | 国产伦理久久精品久久久久_ | 日韩av成人在线观看 | 在线观看亚洲精品视频 | 91精品欧美 | 亚洲成av人片 | 日日夜夜天天久久 | 五月天婷婷在线观看视频 | 日韩羞羞| 亚洲精品日韩在线观看 | 91天堂素人约啪 | 丁香花在线视频观看免费 | 久久久久国产成人免费精品免费 | 综合色站导航 | 免费黄色特级片 | 久久免费电影网 | 成人在线视频一区 | 国产一级在线 | 国产三级午夜理伦三级 | 99视频在线观看免费 | 久久久男人的天堂 | 久久久久久久久电影 | 日韩a在线看 | 91精品蜜桃 | 亚洲精品高清在线观看 | 国产91免费看 | 中午字幕在线观看 | 久久精品国产一区 | 国产第一页福利影院 | 黄网站色 | 97超碰中文字幕 | 在线看福利av | 特及黄色片 | 日本资源中文字幕在线 | 久久精品视频国产 | 在线综合色 | 久久免费电影网 | 久久国产免费看 | 免费视频黄 | 久久99热这里只有精品国产 | 欧美一区二区三区激情视频 | www.久久色.com | 日韩精品在线视频免费观看 | 操老逼免费视频 | 国产一区二区在线看 | 国产成人在线一区 | 日韩欧美黄色网址 | 精品资源在线 | 一区二区三区免费 | 91成人精品一区在线播放69 | 国产在线观看你懂得 | 91亚洲精品国偷拍 | 欧美一区二区三区在线看 | 亚洲国产日韩一区 | 天天综合网天天综合色 | 国产一区二区在线免费观看 | 亚洲综合网 | 三级av免费| 偷拍久久久 | 国产精品视频999 | 草莓视频在线观看免费观看 | 91免费网| 久久精品影视 | 午夜精品视频免费在线观看 | 欧美视频18| 婷婷六月天在线 | 国产成人久久精品77777综合 | 日本久久免费电影 | 欧美精品在线一区 | 97视频免费 | 欧美精品二| 91在线看视频 | 狠狠色丁香婷婷综合视频 | av在线电影网站 | 五月天综合网 | 在线观看视频亚洲 | 久久久麻豆精品一区二区 | 视频在线观看亚洲 | 日日夜夜天天干 | 91在线永久 | 国产精品久久99 | 日韩欧美精品一区二区 | 天天射天天干天天爽 | 亚洲天堂视频在线 | 国产免费影院 | 亚洲 欧美日韩 国产 中文 | 久久久久伦理电影 | 在线观看免费色 | 久久国产精品区 | 日日夜夜操操操操 | 久久66热这里只有精品 | 免费av在线网站 | 五月婷婷综合激情网 | 日本久热| 日韩欧美视频一区二区 | www.亚洲精品视频 | 国产福利一区二区三区视频 | 免费看片在线观看 | 天天爱天天操天天爽 | 就要干b| 91成人短视频在线观看 | 国产主播大尺度精品福利免费 | 日日干天夜夜 | 国产一区二区在线影院 | 亚洲国产日韩欧美 | 精品在线免费视频 | 国产尤物视频在线 | 久草免费福利在线观看 | 操操操天天操 | 亚洲黄色在线免费观看 | 久久激情影院 | 香蕉视频亚洲 | 精品久久久久久久 | 激情综合亚洲精品 | 久久久久久蜜桃一区二区 | 波多野结衣最新 | 久久久久久国产一区二区三区 | 久久99国产精品免费 | 狠狠艹夜夜干 | 中文字幕日韩在线播放 | 国产一级片免费视频 | 一区二区亚洲精品 | 4438全国亚洲精品在线观看视频 | 久久精品国产一区 | 一区二区精品在线视频 | 亚洲国产电影在线观看 | 亚洲精色 | 久久综合狠狠综合久久狠狠色综合 | 成人在线免费看 | 日韩激情网 | 黄色一级动作片 | 久久精品影片 | 欧美极品少妇xxxx | www.色爱| 人人干干人人 | 一本一道波多野毛片中文在线 | 蜜臀久久99精品久久久久久网站 | 中文字幕亚洲欧美日韩 | 午夜av网站| 在线亚洲高清视频 | 97夜夜澡人人双人人人喊 | 欧美日韩不卡一区二区 | 中文字幕欧美日韩va免费视频 | 久久一区二区三区超碰国产精品 | 黄色软件视频网站 | 成人免费中文字幕 | 久久tv视频 | 亚洲激情综合 | 国产精品视频99 | 天天插狠狠插 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 日韩av中文 | 日韩在线免费观看视频 | 在线观看国产区 | 国产精品久久一 | 欧美调教网站 | 亚洲精品乱码久久久久v最新版 | 麻豆91在线播放 | 97涩涩视频 | 日韩艹| 日韩精品一区二区三区在线播放 | 久久香蕉一区 | 欧美精品少妇xxxxx喷水 | 国产在线久草 | 久久视频在线观看免费 | 国产精品国产三级国产aⅴ无密码 | 久久免费国产 | 国产精品mv在线观看 | wwxxxx日本 | 亚洲精品日韩一区二区电影 | 日本在线观看一区二区 | 精品国产诱惑 | 久久精精品视频 | 国产精品 国产精品 | 亚洲国产精品第一区二区 | 国产无套视频 | 午夜精品剧场 | 美女黄频在线观看 | 久久久久久久免费观看 | 超碰97人人爱 | 国产精品一区在线播放 | 日韩二区三区 | 色在线网站 | 欧美国产日韩一区二区三区 | 国产无套精品久久久久久 | 国产视频99 | 免费日韩一区二区三区 | 亚洲国产偷 | jizz欧美性9| 国产精品久久久久久久久久久久久久 | 91理论电影 | 亚洲黄色免费在线 | 91在线你懂的 | 夜夜操狠狠操 | 一区在线播放 | 色99导航 | 国产免费观看av | 黄色网址在线播放 | 91精品视频在线 | 欧美成年人在线观看 | 久久久香蕉视频 | 日本性生活一级片 | 久久99精品国产91久久来源 | 黄色网中文字幕 | 丰满少妇在线观看网站 | 美女久久久 | 国产一卡二卡在线 | 99热在线这里只有精品 | 婷婷在线五月 | www.五月婷婷 | 天堂网中文在线 | 在线观看不卡视频 | 一区二区视频在线免费观看 | 99热 精品在线 | 久久婷婷国产 | 欧美 激情 国产 91 在线 | 丁香5月婷婷久久 | 91成品视频| 成人在线视频你懂的 | 婷婷视频在线播放 | 一区二区三区四区免费视频 | www.久久爱.cn | 在线观看精品一区 | 色网站免费在线观看 | 久久综合中文字幕 | 五月开心激情 | 欧美精品二区 | 国产视频日韩视频欧美视频 | 日本中文字幕在线看 | 一级欧美一级日韩 | 一区二区三区日韩视频在线观看 | 色婷婷精品大在线视频 | 精品亚洲欧美一区 | 欧美在线视频一区二区三区 | 狠狠天天 | 一级a毛片高清视频 | 亚洲国产精品一区二区久久hs | 国产精品网站一区二区三区 | 一区二区 不卡 | 久久久午夜电影 | 久久黄视频 | 欧美日韩精品在线观看视频 | 又黄又刺激的网站 | 97在线精品 | 成人福利av | 久草视频在线资源站 | 欧美精品久久99 | 久久国产电影院 | 色丁香婷婷 | 午夜私人影院 | 久久久精品国产免费观看一区二区 | 欧美伊人网 | 日韩在线视频免费播放 | 欧美日韩免费观看一区=区三区 | 免费看久久久 | 日本电影久久 | 在线视频欧美精品 | 国产一级视频免费看 | 国产精品久久嫩一区二区免费 | 精品国产1区 | 五月婷在线播放 | 怡红院成人在线 | 久久久久久久久久免费 | 国产91精品看黄网站在线观看动漫 | www.日日日.com| 97超碰精品| 精品999在线观看 | 人成免费网站 | 日韩成人xxxx | 五月天久久婷婷 | 99视频在线看 | 日韩一区二区三区免费视频 | 国产区欧美 | 国产精品一区在线观看 | 亚洲精品高清视频在线观看 | 中文成人字幕 | 中文在线a在线 | 免费看国产精品 | 国产99一区视频免费 | 久久99精品久久久久蜜臀 | 91看片淫黄大片在线播放 | 成人黄色在线视频 | 国产精品地址 | 国产精品综合在线观看 | 美女网站视频久久 | 在线播放av网址 | 成人a在线 | 欧美成人精品在线 | 久草免费在线 | 国产综合在线视频 | 天天综合久久 | 色婷婷亚洲 | 99久久精品免费看国产 | 国产91精品看黄网站在线观看动漫 | 久久性生活片 | 久久综合九色综合久久久精品综合 | 日日干激情五月 | 色婷婷www | 中文字幕av在线播放 | 亚洲视频资源在线 | 日日夜夜精品网站 | 国产视频一区精品 | 在线观看免费91 | 天天综合在线观看 | 亚洲精品麻豆 | 天天射天天干 | 青青视频一区 | 日韩一区二区三区免费电影 | 91精品伦理 | 久久国产精品99久久久久久丝袜 | 国产一区免费观看 | 狠狠插狠狠干 | 精品一区91| 天干啦夜天干天干在线线 | 六月丁香综合 | 婷久久| 五月香婷| 国产一级在线免费观看 | 热久久免费视频 | 操操操日日日 | 激情在线免费视频 | 欧美小视频在线 | 日韩精品视频免费 | 精品久久久久久国产 | 国产精品成人免费一区久久羞羞 | av在线播放一区二区三区 | 狠狠色婷婷丁香六月 | 久草视频免费在线观看 | 中文字幕在线免费看线人 | 久久99国产综合精品免费 | 色七七亚洲影院 | 97精品国产91久久久久久 | 日韩精品一区二区三区高清免费 | 一区二区不卡 | 91丝袜美腿 | 天天爱综合 | 久久视频二区 | 亚洲婷婷丁香 | 欧美精品久久久久久久久免 | 九九热视频在线免费观看 | 黄色国产区 | 97精品在线| 国产97免费| 99在线视频观看 | 欧美日韩一区二区三区在线免费观看 | 国产在线精品一区二区三区 | 日韩免费在线观看视频 | 最近中文字幕高清字幕在线视频 | 女人18片 | 色综合久久久久综合 | 亚洲精品国产精品久久99热 | 97色在线观看| 欧美日韩国产在线精品 | 中文字幕电影在线 | 免费进去里的视频 | 激情网五月婷婷 | 国产小视频在线 | 91精品视频在线看 | 黄色小网站在线观看 | 麻豆国产网站 | 99精品国产成人一区二区 | 久久免费视频这里只有精品 | 久久96国产精品久久99漫画 | 粉嫩高清一区二区三区 | 精品国产一区二区三区四区vr | 欧美亚洲精品在线观看 | 久久不见久久见免费影院 | 婷婷精品国产欧美精品亚洲人人爽 | 亚洲涩涩色 | 国产精品毛片一区二区 | 国产精品久久电影网 | 亚洲精品456在线播放第一页 | 色视频在线观看 | 亚洲精品视频网站在线观看 | 精品视频免费播放 | 国内精品久久久久久中文字幕 | 亚洲精品一区二区三区四区高清 | 六月丁香综合网 | 久久精品一级片 | 中文字幕免| 欧美性春潮 | 天天天色综合 | 99精品亚洲 | 亚洲一区不卡视频 | av在线电影免费观看 | 国产高清视频 | 精品国产欧美 | 99久国产| 日韩精品一区在线观看 | 国产aa免费视频 | 久久久国产一区二区 | 日日天天狠狠 | 国产91精品一区二区麻豆网站 | 在线观看视频黄 | 日韩大片在线免费观看 | 久久五月婷婷综合 | 五月花丁香婷婷 | 黄色影院在线观看 | 五月亚洲 | 久久久久久国产精品美女 | 伊人国产在线播放 | 国产999| 国产老太婆免费交性大片 | 色综合中文综合网 | 98久久| 美女久久一区 | 日韩成人免费在线观看 | 四虎永久免费网站 | 午夜av免费在线观看 | 国产玖玖在线 | 亚洲国产成人在线播放 | 亚洲永久av| 免费黄av| 国内精品视频一区二区三区八戒 | 国内精自线一二区永久 | 久久激情视频 | 久久国产精品一区二区 | 久草免费手机视频 | 97色资源| 成人免费在线播放 | 国产三级视频在线 | 中文字幕人成乱码在线观看 | 麻豆视频在线观看 | 在线看成人 | 国产精品久久久区三区天天噜 | 91一区啪爱嗯打偷拍欧美 | 天天操天天操天天干 | 久久欧美视频 | 91在线日韩 | 国产精品夜夜夜一区二区三区尤 | 精品国产一二三四区 | а中文在线天堂 | 波多野结衣电影一区二区 | 国产福利网站 | 久久免费av电影 | 国产成人精品av在线 | 最近更新的中文字幕 | 久草在线在线视频 | 最近中文字幕大全 | 免费看国产一级片 | 五月婷亚洲 | 久久夜色精品国产欧美乱 | 黄色三级在线 | 久久狠狠亚洲综合 | 欧美激情视频一区二区三区免费 | 人人澡人摸人人添学生av | 美女视频黄免费 | 国产成年人av| 丝袜av网站| 天堂入口网站 | 人人爽爽人人 | 免费a网址 | 午夜体验区 | 99久久精品免费看国产一区二区三区 | 国产91小视频 | 在线观看久久久久久 | 午夜免费福利片 | 色七七亚洲影院 | 国产18精品乱码免费看 | 五月丁香 | 91精品国产99久久久久久红楼 | 免费特级黄色片 | www.夜色321.com | 久久综合九色欧美综合狠狠 | 91视频在线观看下载 | 久久99热这里只有精品 | 精品主播网红福利资源观看 | 日韩中文字幕在线不卡 | 国产精品18久久久久白浆 | 黄色亚洲大片免费在线观看 | 69热国产视频 | 国产精品久久久一区二区 | 日韩区在线观看 | 丁香 久久 综合 | 国产午夜免费视频 | 中文 一区二区 | 国产精品一区二区av | 亚洲免费一级 | 人人超碰在线 | 久久久久久久久久久久av | 最近中文字幕完整视频高清1 | 视频三区在线 | 国产精品完整版 | 91探花国产综合在线精品 | 久久6精品 | 久久久久久久久久久网 | 天天操天天透 | 99久久99久国产黄毛片 | 国产高清专区 | 午夜免费视频网站 | 久久综合狠狠综合久久狠狠色综合 | 日本动漫做毛片一区二区 | 日韩在线网| 精品久久久久久久 | 欧美91成人网 | 国产成人精品一区二区在线观看 | 黄色片亚洲 | 国产精品麻豆欧美日韩ww | 天天色天天操天天爽 | 天天操天天射天天插 | 国产精品视频资源 | 久久久久久毛片精品免费不卡 | 欧美日韩不卡在线视频 | 久久国产精品99国产精 | 日韩电影在线看 | 99精品视频99 | 国产中文字幕视频在线观看 | 97干com | 在线小视频 | 国产成人精品一区二区三区在线 | 91资源在线视频 | 在线视频 区 | 最近中文字幕在线中文高清版 | 日韩电影在线观看一区二区三区 | 国产成人av在线 | 97国产一区二区 | av在线免费观看不卡 | 久久人网 | 成人午夜影院 | 日韩欧美在线一区 | 欧美激情精品久久久久久变态 | 在线观看黄av | 久久久噜噜噜久久久 | 欧美先锋影音 | 久久香蕉电影网 | av免费看网站 | 手机看片久久 | 成人一区二区三区中文字幕 | 中文字幕 影院 | 亚洲成aⅴ人片久久青草影院 | 国产精品免费观看在线 | 人人搞人人搞 | av先锋中文字幕 | 中文字幕精品三级久久久 | 91桃色免费观看 | 久久精品国产亚洲a | 国产高清av免费在线观看 | 高清av网 | 亚洲视频一区二区三区在线观看 | 黄色软件在线看 | 国产专区视频在线观看 | 日韩av免费大片 | 免费看的视频 | 国产精品毛片一区二区在线看 | 欧美一级片免费播放 | 亚洲综合成人专区片 | 91激情视频在线播放 | 国产无遮挡又黄又爽在线观看 | 一级黄色片毛片 | 中文字幕高清视频 | 国产成人在线免费观看 | 九九久久久久久久久激情 | 久久精品国产成人 | 超碰精品在线 | www.久久色.com | 国产午夜三级一区二区三 | 免费91麻豆精品国产自产在线观看 | 午夜视频在线观看欧美 | 蜜桃av综合网 | 欧美不卡在线 | 999视频在线播放 | 婷婷丁香六月 | 色狠狠久久av五月综合 | 日韩av在线小说 | 九九精品视频在线 | 精品国产成人在线影院 | 国产午夜精品理论片在线 | 99久久国产免费免费 | 欧美国产精品久久久久久免费 | 国产精品专区h在线观看 | 99精品免费在线 | 99九九99九九九视频精品 | 久久蜜臀一区二区三区av | 国产精品99久久久久 | 伊人成人精品 | 国产亚洲视频在线免费观看 | 日韩区欠美精品av视频 | 国产粉嫩在线 | 91九色国产蝌蚪 | 激情亚洲综合在线 | 精品免费久久久久 | 五月婷婷电影网 | 日韩黄色在线电影 | 欧美天天综合网 | 国产一二三四在线观看视频 | 高清不卡毛片 | 婷婷免费在线视频 | 亚洲黄色成人av | 亚洲一区二区视频在线 | 国产精品视频不卡 | 日韩精品 在线视频 | 国产亚洲精品久久网站 | 中文在线中文资源 | 久久综合九色99 | 波多野结衣视频一区二区三区 | 99久久久国产精品免费99 | 人人爽人人爽人人片 | 片网址| 中文视频在线播放 | 日韩免费视频播放 | 久久精品资源 | 成人欧美一区二区三区黑人麻豆 | 中文字幕免费一区 | 亚洲毛片一区二区三区 | 久久免费片 | 国产高清视频免费观看 | 国产一级免费观看 | 91看片淫黄大片在线播放 | 99视频偷窥在线精品国自产拍 | 中文字幕在线高清 | 黄色性av | 久草新在线 | 波多野结衣精品视频 | 免费看十八岁美女 | 国产精品亚洲片夜色在线 | 国产99久久九九精品 | 99在线免费观看视频 | 成人片在线播放 | 99婷婷狠狠成为人免费视频 | 久久免费av | 午夜精品久久久久久久99 | 免费97视频| 亚洲黄色在线免费观看 | 国产91精品久久久久久 | 天天激情综合网 | 91亚洲成人| 人人插人人澡 | 永久免费的av电影 | 综合激情久久 | 有码中文字幕在线观看 | 日韩在线高清免费视频 | 国产在线观看二区 | 免费av试看| 夜夜骑首页 | 久久久久9999亚洲精品 | 99久久婷婷国产综合亚洲 | 99r在线视频 | 一级欧美日韩 | 一区二区免费不卡在线 | 久久免费一 | 国产青春久久久国产毛片 | 91av免费在线观看 | 国产亚洲精品精品精品 | 一级欧美一级日韩 | 免费在线观看91 | 久久毛片视频 | 又粗又长又大又爽又黄少妇毛片 | 国产一区二区不卡在线 | 日韩videos高潮hd| 亚洲高清av在线 | 成人国产一区二区 | 日韩欧美在线观看一区 | 欧美aaaxxxx做受视频 | 午夜精品一区二区三区在线视频 | 黄色小说视频在线 | 国产精品久久久av | 天天久久综合 | 黄色免费在线视频 | 69av在线播放 | 日韩中文字幕视频在线观看 | 久久大视频 | 丝袜制服天堂 | 久久av高清 | 永久黄网站色视频免费观看w | 国产精品四虎 | 在线免费观看av网站 | 在线播放一区二区三区 | 国产视频久久久 | 亚洲欧美国产日韩在线观看 | 色天天天| 丁香婷婷综合激情五月色 | 亚洲成aⅴ人片久久青草影院 | 久久久久国产成人精品亚洲午夜 | 日韩欧美大片免费观看 | 日日干精品 | 欧美一级淫片videoshd | 成人久久18免费网站麻豆 | 综合网五月天 | 一级黄色大片 | 色视频在线看 | 五月天网站在线 | 国产精品一区二区视频 | 最近的中文字幕大全免费版 | 久久久久五月天 | 国产女人18毛片水真多18精品 | 99热精品国产一区二区在线观看 | 免费三级大片 | 四虎国产永久在线精品 | 91豆麻精品91久久久久久 | 亚洲在线网址 | 国产亚洲精品久久久久久无几年桃 | 日韩区欧美久久久无人区 | 97精品国产一二三产区 | 特级黄色片免费看 | 高清色免费 | 国产精品视频区 | 在线视频免费观看 | 狠狠操狠狠干天天操 | 久久久久免费网站 | 国产区精品 | 日韩毛片在线免费观看 | 国产精品mm | 天天天天爱天天躁 | 久久精品视频在线免费观看 | 成人网页在线免费观看 | 色婷婷88av视频一二三区 | 日韩精品一区二区三区在线视频 | 欧美在线视频一区二区三区 | 亚洲欧美在线观看视频 | 在线观看亚洲国产精品 | 久久综合色婷婷 | 人人狠狠综合久久亚洲婷 | 久久午夜羞羞影院 | 国产精品理论片 | 国产人成在线视频 | a视频免费看 | 久久免费在线观看 | 一级特黄av | 免费看一级片 | 亚洲做受高潮欧美裸体 | 午夜精品婷婷 | 色91在线视频 | 日韩精品国产一区 | 在线观看日本高清mv视频 | 久久久精品综合 | 久久夜夜爽 | 亚洲,播放 | 午夜久久网站 | 91看片看淫黄大片 | 最近中文字幕大全中文字幕免费 | 国产又粗又猛又爽又黄的视频免费 | 99精品视频在线观看免费 | 国产在线观看免费 | 综合久久五月天 | 午夜电影中文字幕 | 日一日干一干 | 日韩精品久久久 | 福利视频网址 | 337p日本欧洲亚洲大胆裸体艺术 | 97国产精品一区二区 | 在线免费看黄色 | 精品视频亚洲 | 中文字幕一区二区在线播放 | 91日韩精品视频 | 中文字幕一区二区三区精华液 | 很黄很色很污的网站 | 香蕉影视app | 国产精品二区三区 | 成人网页在线免费观看 | 国产视频手机在线 | 久久国内精品 | 日韩av在线影视 | 特级毛片在线观看 | 亚洲精品玖玖玖av在线看 | 欧美aaa大片| www.av免费| 亚洲精品美女免费 | 国产精品6 | 欧美日韩中文在线视频 | 麻豆视频免费在线播放 | 久久久国际精品 | 亚洲国产成人在线 | 日本精品视频免费观看 | 一区二区视频电影在线观看 | www.久久久 | 久久久精品欧美一区二区免费 | 久久狠狠一本精品综合网 | www.色在线| 黄色福利网站 | 黄色片免费电影 | 亚洲国产精品一区二区久久,亚洲午夜 | 久久综合九色综合97_ 久久久 | 超碰免费久久 | 亚洲精品久久视频 | 国产精品色在线 | 特级黄色电影 | 国产黄色理论片 | 91av原创| 国产视频精品在线 | 国产中年夫妇高潮精品视频 | 色吊丝在线永久观看最新版本 | 看黄色91| 天天操天天射天天 | 国产福利精品在线观看 | 一级久久精品 | 日韩二区精品 | 五月婷婷激情六月 | 日黄网站 | 午夜国产一区二区 | 欧美一级片在线观看视频 | 成人亚洲精品国产www | 六月激情久久 | 西西4444www大胆无视频 | 亚洲精品国产视频 | 西西www4444大胆视频 | 精品国产电影 | av免费在线网站 | 免费日韩一区 | 日韩在线视频免费播放 | 国产一区免费视频 | 欧美视频在线观看免费网址 | 国产资源精品 | 最近中文字幕免费视频 | 天天爽天天射 | 五月天视频网 | 国产精品丝袜在线 | 中文字幕av电影下载 | 人人爱人人爽 | 久av电影 | 黄色精品久久 | 国产一级片视频 | 成人91免费视频 | 国产精品高清免费在线观看 | 午夜精品三区 | 国产高清视频在线 | 欧美色图亚洲图片 | 激情开心网站 | 免费观看全黄做爰大片国产 | 日韩电影在线视频 | 青春草国产视频 | 日韩午夜剧场 | 国产69精品久久99的直播节目 | 最近中文字幕第一页 | 日韩av中文| 在线视频 日韩 | 国产成人av电影在线观看 | 97人人模人人爽人人喊网 | 色综合久久久久网 | 91精品久久久久久综合五月天 | 麻豆精品传媒视频 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 一区二区三区国产欧美 | 国内精品久久久久久久97牛牛 | 亚洲免费永久精品国产 | 国产精品免费一区二区三区在线观看 | 久久久久久久久久国产精品 | 午夜av网站| 91精品蜜桃| 精品久久久久免费极品大片 | 91麻豆产精品久久久久久 | a在线观看国产 | 久久久久99精品成人片三人毛片 | 亚洲精品高清视频在线观看 | 97偷拍视频 | 国产香蕉视频在线观看 | 激情视频免费在线观看 |