0

Ich habe ein Problem, nämlich, ich habe eine Anwendung, die in der RecyclerView 2 Arten von Salaten angezeigt und nach dem Drücken, sollte einer von ihnen zeigen eine genaue Angabe ihrer Details mit der Option, ob oder nicht wir mögen es. Diese Daten werden offensichtlich aus der Datenbank abgerufen. Und alles funktioniert, bis wir zur Detailansicht gehen - wenn wir auf das Bild des griechischen Salats klicken, bekommen wir eine leere Ansicht, aber was ist interessant, wenn wir auf den Hühnersalat klicken, bekommen wir nur einen Blick auf griechischen Salat? Also, wo ist der Blick auf den Hühnersalat? Und warum die Ansichten zu Orten wurden. Ich füge den Code unten an die Bilder an, damit Sie genau verstehen können, was das Problem ist.Datenbank zeigt keine Daten korrekt

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); 
} 

}

Salat

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

enter image description here

Also, wenn ich auf Salat griechischen klicken, erhalte ich eine leere Ansicht, die nur mit der Option, ob es ein Favorit. Und wenn ich den Hühnersalat trinke, bekomme ich einen Blick auf den griechischen Salat. Ich habe keine Ahnung, was los ist?

enter image description here

enter image description here

+0

Ich sehe nicht Ihre Recyclerview oder den Adapter. Bist du sicher, dass du sie benutzt? – msecilmis

+0

Apropos, aber ich glaube nicht, dass wir die Screenshots brauchen. Ich möchte den Layout-XML-Inhalt sehen. – Barns

+0

@msecilmis Sie sind richtig, mein Fehler zweimal Ich habe den SaladDetailActivity-Code kopiert, ich habe es bereits behoben, es sollte auch eine SaladFragment-Klasse und es ist RecyclerView. Ich habe eine RecyclerAdapter-Klasse hinzugefügt, in der ich einen Interface-Listener habe. – newActivity21

Antwort

0

Problem ist in der onClick Methode in SaladMaterialFragment Klasse. Sie übergeben die Position des Elements, und in ArrayList Indizierung beginnt mit 0. Bei der Datenbankeinfügung wird jedoch _id INTEGER PRIMARY KEY AUTOINCREMENT, Datenbankindizierung mit 1 gestartet.
Sie müssen also onClick Methode mit unten ändern.

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); 
      } 
     }); 

Position mit Position Ändern Sie einfach + 1.

+0

Danke Mann! Genau das habe ich gesucht! Alles funktioniert wie es soll :) – newActivity21

0

Auch einfügen Sie den int Wert Ihrer drawable Ressource, die keine gute Idee ist. Dieser Wert ist nicht unbedingt während der gesamten Lebensdauer Ihrer App konstant - eine neuere Version kann dieser Ressource einen neuen Wert zuweisen. Also bitte tu das nicht.

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

Karte Statt die drawable einer unabhängigen noch konstante Referenz. Manche Dinge wie:

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

Also, da haben Sie möglicherweise viele Zeilen in der Datenbank mit dem gleichen Salat Typ (zB.Griechischer Salat) mit möglicherweise vielen verschiedenen Ressourcen-IDs. Wenn Sie Ihre Datenbank nach einem Salattyp abfragen, erhalten Sie möglicherweise die falsche Ressourcen-ID. Dies könnte das Problem verursachen, dass Sie Ihr Bild nicht anzeigen können.

-Test dies durch den Vergleich der int Wert aus der Datenbank kommen (int photoId = cursor.getInt(1)) und dem int Wert von R.drawable.salad_greek.

In Ihrem SaladDetailActivity Sie sollten auch überprüfen, um zu sehen, ob Sie einen gültigen Wert erhalten:

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

"In Ihrer DatabaseHelper-Klasse scheint es, als würden Sie jedes Mal, wenn Sie diese Klasse aufrufen, eine neue Zeile einfügen. Ich sehe keine UNIQUE-Einschränkungen für diese Tabelle. Wenn dies der Fall ist, werden Sie den Speicherbedarf Ihrer Apps erhöhen und die Datenbank mit nutzlosen Daten füllen sowie möglicherweise ungültige Daten. " Also was muss ich tun? Ich lerne nur die Datenbanken und nicht genau, worum es geht. – newActivity21

+0

Danke für den Vorschlag, das int in drawable zu ändern, habe ich schon gemacht. "Testen Sie dies, indem Sie den int-Wert aus der Datenbank (int photoId = cursor.getInt (1)) und den int-Wert von R.drawable.salad_greek vergleichen . " - also mein int photoid nenne mich Salat Griechisch, also wo ist Salad Chicken? Ich weiß nicht, wo ein Problem ist. – newActivity21