2017-10-06 85 views
0

我有一個問題,即,我有一個應用程序顯示在RecyclerView 2類型的沙拉,並按後,其中一個應該顯示一個視圖顯示其確切的細節,我們不喜歡它。這些數據顯然是從數據庫中檢索的。而且一切都有效,直到我們進入詳細視圖 - 當我們點擊希臘沙拉的圖片時,我們看到一片空白的景色,但是當點擊雞肉沙拉時,我們只能看到希臘沙拉的景色,有趣的是什麼?那麼雞肉沙拉的視角在哪裏?爲什麼這些觀點變成了地方。我將底部的代碼附在圖片上,以便您可以準確理解問題所在。數據庫不能正確顯示數據

DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper { 

private static final String DB_NAME = "app"; 
private static final int DB_VERSION = 1; 

public MiodzioDatabaseHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL("CREATE TABLE SALAD (_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + "NAME TEXT, " 
      + "IMAGE_RESOURCE_ID INTEGER, " 
      + "FAVORITE INTEGER);"); 

    insertSalatki(db, "Greek salad", R.drawable.salad_greek, 0); 
    insertSalatki(db, "Chicken salad", R.drawable.salad_chicken, 0); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

private static void insertSalatki(SQLiteDatabase db, String name, int resourceId, int favorite){ 

    ContentValues saladValues = new ContentValues(); 
    salatkiValues.put("NAME", name); 
    salatkiValues.put("IMAGE_RESOURCE_ID", resourceId); 
    salatkiValues.put("Favorite", favorite); 
    db.insert("SALAD", null, salatkiValues); 
} 

}

沙拉

public class Salad { 

    private String name; 
    private int imageResourceId; 


    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getImageResourceId() { 
     return imageResourceId; 
    } 

    public void setImageResourceId(int imageResourceId) { 
     this.imageResourceId = imageResourceId; 
    } 
} 

SaladDe tailActivity

public class SaladDetailActivity extends AppCompatActivity { 

public static final String EXTRA_SALAD = "salad"; 


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

    int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD); 

    try { 

     SQLiteOpenHelper miodzioDatabaseHelper = new MiodzioDatabaseHelper(this); 
     SQLiteDatabase db = miodzioDatabaseHelper.getWritableDatabase(); 


     Cursor cursor = db.query("SALATKI", 
       new String[]{"NAME", "IMAGE_RESOURCE_ID", "FAVORITE"}, 
       "_id = ?", 
       new String[]{Integer.toString(salads)}, 
       null, null, null); 

     if(cursor != null) { 
      if (cursor.moveToFirst()) { 

       do { 

        String nameText = cursor.getString(0); 
        int photoId = cursor.getInt(1); 

        boolean isFavorite = (cursor.getInt(2) == 1); 

        TextView name = (TextView) findViewById(R.id.salad_text); 
        name.setText(nameText); 

        ImageView photo = (ImageView) findViewById(R.id.salad_image); 
        photo.setImageResource(photoId); 
        photo.setContentDescription(nameText); 

        CheckBox favorite = (CheckBox) findViewById(R.id.favorite); 
        favorite.setChecked(isFavorite); 
       }while (cursor.moveToNext()); 
      } 
     } 

     cursor.close(); 
     db.close(); 

    }catch (SQLiteException e){ 
     Toast.makeText(this, "Database does not work!", Toast.LENGTH_SHORT).show(); 
    } 


    Toolbar myChildToolbar = (Toolbar) findViewById(R.id.my_child_toolbar_salad_detail); 
    setSupportActionBar(myChildToolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 



@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.action_create_order: 
      Intent intent = new Intent(this, AddActivity.class); 
      startActivity(intent); 
      return true; 
     default: 

      return super.onOptionsItemSelected(item); 
    } 


} 

public void onFavoriteClicked(View view) { 

    int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD); 

    CheckBox favorite = (CheckBox) findViewById(R.id.favorite); 

    ContentValues saladValues = new ContentValues(); 


    saladValues.put("FAVORITE", favorite.isChecked()); 

    SQLiteOpenHelper databaseHelper = new DatabaseHelper(this); 

    SQLiteDatabase db = databaseHelper.getWritableDatabase(); 
    db.update("SALAD", saladValues, 
      "_id = ?", new String[]{Integer.toString(salads)}); 
    db.close(); 
} 

}

SaladMaterialFragment

public class SaladMaterialFragment extends Fragment { 


    private DatabaseHelper dataBaseHelper; 
    private Cursor cursor; 

    private ArrayList<Salad> arrayList = new ArrayList<>(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     RecyclerView saladRecyler = (RecyclerView) inflater.inflate(R.layout.fragment_salad_material, container, false); 

     try{ 
      SQLiteOpenHelper databaseHelper = new databaseHelper(inflater.getContext()); 
      SQLiteDatabase db = databaseHelper.getReadableDatabase(); 

      cursor = db.query("SALAD", 
        new String[] {"NAME", "IMAGE_RESOURCE_ID"}, 
        null, null, null, null, null); 

      if(cursor != null){ 
       if(cursor.moveToFirst()){ 
        do{ 
         Salad salads = new Salad(); 
         salad.setName(cursor.getString(0)); 
         salad.setImageResourceId(cursor.getInt(1)); 
         arrayList.add(salad); 

        }while (cursor.moveToNext()); 
       } 
      } 

     }catch (SQLiteException e){ 
      Toast.makeText(inflater.getContext(), "Database does not work!", Toast.LENGTH_SHORT).show(); 
     } 

      CaptionedImagesAdapter adapter = new CaptionedImagesAdapter(getActivity(), arrayList); 
      saladRecyler.setAdapter(adapter); 

      GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); 
      saladRecyler.setLayoutManager(gridLayoutManager); 

      adapter.setListener(new CaptionedImagesAdapter.Listener() { 
       @Override 
       public void onClick(int position) { 
        Intent intent = new Intent(getActivity(), SaladDetailActivity.class); 
        intent.putExtra(SaladDetailActivity.EXTRA_SALAD, position); 
        getActivity().startActivity(intent); 
       } 
      }); 
     return salatkaRecyler; 
     } 

    } 

SaladDetailLayout

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.hfad.SaladDetailActivity"> 


<android.support.v7.widget.Toolbar 
    android:id="@+id/my_child_toolbar_salad_detail" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/actionBarSize" 
    android:background="@android:color/holo_green_light" 
    android:elevation="4dp" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    /> 

<TextView 
    android:id="@+id/salatki_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge"/> 


<ImageView 
    android:id="@+id/salad_image" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true"/> 

<CheckBox 
    android:id="@+id/favorite" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/favorite" 
    android:onClick="onFavoriteClicked"/> 

enter image description here

所以,當我點擊希臘沙拉,我得到一個空的觀點僅與它是否是一個最喜歡的選項。當我點擊雞肉沙拉時,我會看到希臘沙拉。我不知道發生了什麼事?

enter image description here

enter image description here

+0

我沒有看到您的recyclerview或適配器。你確定你在使用它們嗎? – msecilmis

+0

爲我自己說話,但我不認爲我們需要截圖。我希望看到Layout xml內容。 – Barns

+0

@msecilmis 你是對的,我的錯誤兩次,我複製了SaladDetailActivity代碼,我已經修復了,還應該有一個SaladFragment類,它是RecyclerView。我添加了一個RecyclerAdapter類,其中有一個接口偵聽器。 – newActivity21

回答

0

問題是在SaladMaterialFragment類的onClick方法。 您正在傳遞該項目的位置,並在ArrayList索引以0開頭。 但是在數據庫插入中,_id INTEGER PRIMARY KEY AUTOINCREMENT,數據庫索引將以1開頭。
所以你需要改變下面的onClick方法。

adapter.setListener(new CaptionedImagesAdapter.Listener() { 
      @Override 
      public void onClick(int position) { 
       Intent intent = new Intent(getActivity(), SaladDetailActivity.class); 
       intent.putExtra(SaladDetailActivity.EXTRA_SALAD, position+1); 
       getActivity().startActivity(intent); 
      } 
     }); 

只要改變位置位置+ 1

+0

謝謝你的男人!這正是我所期待的!一切正常,因爲它應該:) – newActivity21

0

而且您要插入的int值的drawable資源這是不是一個好主意。該值在您的應用程序的整個生命週期中不一定是恆定的 - 稍後的版本可能會爲此資源發出新的值。 所以請不要這樣做。

insertSalatki(db, "Greek salad", R.drawable.salad_greek, 0); 

取而代之的是將drawable映射爲一個獨立但不變的參考。有些事是這樣的:

insertSalatki(db, "Greek salad", idSaladGreek, 0); 

所以,因爲你的數據庫中可能有很多行與沙拉類型相同(例如,希臘沙拉)與潛在的許多不同的資源ID,當你查詢你的數據庫沙拉類型你可能會得到錯誤的資源ID。這可能會導致您無法顯示圖像的問題。

通過比較來自數據庫的int值(int photoId = cursor.getInt(1))和intR.drawable.salad_greek進行測試。

在你SaladDetailActivity你也應該檢查,看看是否要爲得到一個有效值:

int salads = (Integer) getIntent().getExtras().get(EXTRA_SALAD); 
+0

「在你的DatabaseHelper類中,每當你調用這個類的時候,你看起來就像插入一個新行一樣?我沒有看到這個表的UNIQUE約束,如果這樣你會增加你的應用程序存儲空間,併爲你的數據庫填充無用的數據以及可能無效的數據。「所以我必須做什麼? 我只是在學習數據庫,不完全是它的全部內容。 – newActivity21

+0

感謝您將int更改爲drawable的建議,我已經做到了。「通過比較來自數據庫的int值(int photoId = cursor.getInt(1))和R.drawable.salad_greek的int值「。 - 所以我的int photoId叫我沙拉希臘,那麼沙拉雞在哪裏?我不知道問題出在哪裏。 – newActivity21