Alternatief antwoord
Het volgende is de code voor een vrij eenvoudig, maar werkend voorbeeld. Het gaat echter een beetje verder door een ListView . op te nemen en verwijdering toestaan door lang te klikken op een item in de ListView .
Dit gebruikt echter geen fragmenten.
Er zijn 3 stukjes code, de MainActivity (MainActivity.java
), De SQLiteOpenHelper-subklasse CrimeDBHelper (CrimeDBHelper.java
) en de lay-out voor de MainActivity, activity_main.xml
:-
activity_main.xml
Dit is vrij rechttoe rechtaan. Merk op dat het een ListView . bevat aan het einde.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="The Crime Thing"
android:layout_gravity="center"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Title"
/>
<EditText
android:id="@+id/crimetitle"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Date"
/>
<EditText
android:id="@+id/crimedate"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Suspect"
/>
<EditText
android:id="@+id/crimesuspect"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Solved?"
/>
<CheckBox
android:id="@+id/crimesolved"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/addcrime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD CRIME"/>
<Button
android:id="@+id/dltcrime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DLT CRIME (ID=?)"/>
<ListView
android:id="@+id/crimelist"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
CrimeDBHelper.java
De meeste zijn vergelijkbaar, behalve de aanvullende methode getCrimeList()
, dit geeft een cursor terug die alle gegevens uit de misdaadtabel bevat (gebruikt voor het vullen van de ListView).
public class CrimeDBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "crimesdb";
public static final int DBVERSION = 1;
public static final String CRIMESTABLE = "crimes";
public static final String CRIMEID_COL = "_id";
public static final String CRIMETITLE_COL = "crimetitle";
public static final String CRIMEDATE_COL = "crimedate";
public static final String CRIMESUSPECT_COL = "crimesuspect";
public static final String CRIMESOLVED_COL = "crimesolved";
public static final String TABLECRTSQL =
"CREATE TABLE " + CRIMESTABLE + "(" +
CRIMEID_COL + " INTEGER PRIMARY KEY," +
CRIMETITLE_COL + " TEXT," +
CRIMEDATE_COL + " TEXT, " +
CRIMESUSPECT_COL + " TEXT, " +
CRIMESOLVED_COL + " INTEGER" +
");";
public CrimeDBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLECRTSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
}
public long addCrime(String crimetitle, String crimedate, String crimesuspect, int crimesolved) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(CRIMETITLE_COL,crimetitle);
cv.put(CRIMEDATE_COL,crimedate);
cv.put(CRIMESUSPECT_COL,crimesuspect);
cv.put(CRIMESOLVED_COL,crimesolved);
return db.insert(CRIMESTABLE,null,cv);
}
public int deleteCrime(long crimeid) {
SQLiteDatabase db = getWritableDatabase();
String whereclause = CRIMEID_COL + "=?";
String[] whereargs = {Long.toString(crimeid)};
return db.delete(CRIMESTABLE,whereclause,whereargs);
}
public Cursor getCrimeList() {
SQLiteDatabase db = getWritableDatabase();
return db.query(CRIMESTABLE,null,null,null,null,null,null,null);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText mCrimeTitle;
EditText mCrimeDate;
EditText mCrimeSuspect;
CheckBox mCrimeSolved;
Button mAddCrime;
Button mDltCrime;
ListView mCrimeList;
CrimeDBHelper dbhlpr = new CrimeDBHelper(this);
Cursor crimelist;
SimpleCursorAdapter sca;
long lastcrimeid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCrimeTitle = (EditText) findViewById(R.id.crimetitle);
mCrimeDate = (EditText) findViewById(R.id.crimedate);
mCrimeSuspect = (EditText) findViewById(R.id.crimesuspect);
mCrimeSolved = (CheckBox) findViewById(R.id.crimesolved);
mCrimeList = (ListView) findViewById(R.id.crimelist);
mAddCrime = (Button) findViewById(R.id.addcrime);
mDltCrime = (Button) findViewById(R.id.dltcrime);
crimelist = dbhlpr.getCrimeList();
// Setup Button to Add a crime
mAddCrime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int solved = 0;
if (mCrimeSolved.isChecked()) {
solved = 1;
}
lastcrimeid = dbhlpr.addCrime(
mCrimeTitle.getText().toString(),
mCrimeDate.getText().toString(),
mCrimeSuspect.getText().toString(),
solved
);
mDltCrime.setText("DLT CRIME (ID=" + Long.toString(lastcrimeid) + ")");
mDltCrime.setTag(lastcrimeid);
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
}
});
// Setup button to delete the latest Crime added
mDltCrime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//dbhlpr.deleteCrime(lastcrimeid); can do it this way
if (view.getTag() != null) {
dbhlpr.deleteCrime((long)view.getTag());
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
}
}
});
sca = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
crimelist,
new String[]{CrimeDBHelper.CRIMETITLE_COL},
new int[]{android.R.id.text1},
0
);
mCrimeList.setAdapter(sca);
mCrimeList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
dbhlpr.deleteCrime(l);
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
return true;
}
});
}
protected void onDestroy() {
super.onDestroy();
if (crimelist != null) {
crimelist.close();
}
}
}
Het eerste dat opvalt is de regel long lastcrimeid;
, dit wordt op klasniveau gedeclareerd en is dus overal beschikbaar (het probleem dat u had met long databaseID
).
Mogelijk merkt u ook SimpleCursorAdapter sca;
dit wordt gebruikt voor de ListView
(in feite plaatst het de gegevens van de cursor in de ListView ).
U moet bekend zijn met veel van de volgende code. Samengevat:-
- super.onCreate heet.
- De activiteit is ingesteld om de layout activity_main.xml te gebruiken.
- Als de lay-out is geladen, worden de id's die bij de weergaven horen, verkregen.
-
Er wordt een cursor verkregen die de huidige misdaden uit de database haalt (mogelijk geen, dit is geen probleem).
-
de knoplistener voor het toevoegen van een misdaad is toegevoegd. Merk op dat dit de geretourneerde _id . gebruikt van de toegevoegde rij twee keer (eigenlijk 3 keer omdat het de tekst van de verwijderknoppen dienovereenkomstig verandert ).
lastcrimeid
wordt ingesteld door de terugkeer van deaddCrime()
methode.-
mDltCrime.setTag(lastcrimeid);
stelt de tag van de verwijderknop in op de_id
van de toegevoegde rij. -
Merk ook op dat er twee extra regels bestaan, namelijk
crimelist = dbhlpr.getCrimeList();
ensca.swapCursor(crimelist);
.- De eerste vervangt de cursor door wat zich nu in de database bevindt (d.w.z. inclusief de rij die is toegevoegd), de tweede vertelt de ListView om de nieuwe cursor te gebruiken, zodat de ListView laat zien wat er nu in de database staat ( dit wordt opnieuw gebruikt bij het verwijderen van een rij).
-
de knoplistener voor de verwijderknop wordt dan toegevoegd. Dit kan op twee manieren werken. De
lastcrimeid
kan worden gebruikt of als alternatief kan het tage van de knop worden gebruikt omdat beide de _id . vasthouden van de rij die moet worden verwijderd. De code heeft de eerste uitgecommentarieerd, dus de laatste methode wordt gebruikt (d.w.z. de waarde in de tag van de knop wordt opgehaald).- Merk op dat deze laatste methode het nadeel heeft dat de waarde null kan zijn, wat een null-pointeruitzondering zou veroorzaken, vandaar de
if (view.getTag != null)
.
- Merk op dat deze laatste methode het nadeel heeft dat de waarde null kan zijn, wat een null-pointeruitzondering zou veroorzaken, vandaar de
-
Zoals hierboven voor het vernieuwen van de ListView .
-
Vervolgens wordt de SimpleCursorAdapter ingesteld, er zijn 5 parameters voor nodig:-
- de te gebruiken lay-out (android.R.layout.simple_list_item_1) is een standaardlay-out.
- de te gebruiken gegevens in de vorm van een cursor. NOTITIE! een kolom met de naam _id MOET bestaan (in het algemeen is het een goed idee om altijd
_id INTEGER PRIMARY KEY
te gebruiken om deze reden. ) Merk op dat we een cursorcrimelist
. krijgen via degetCrimeList
methode. - De kolom(men) in de cursor waaruit de gegevens moeten worden opgehaald.
- De weergave(n) in de lay-out waar de opgehaalde gegevens worden geplaatst.
- Een waarde waarvan ik me het doel niet kan herinneren. Maar 0 is prima te gebruiken. Het niet coderen van deze 5e parameter zal waarschijnlijk resulteren in een verouderd bericht.
- (Opmerking:ik gebruik normaal gesproken Custom CursorAdapters omdat ze veel flexibeler zijn, dus gebruik zelden Simples).
-
Vervolgens wordt de ListView verteld om de adapter te gebruiken volgens
mCrimeList.setAdapter(sca);
. -
Dan een
onItemLongClickListener
wordt toegevoegd aan de ListView, die de misdaad verwijdert waarop lang is geklikt (lange l is de _id waarde, vandaar een reden waarom een CursorAdapter _id . nodig heeft en daarom waaromdbhlpr.deleteCrime(l);
).- Nogmaals de ListView is vernieuwd.
-
Ten slotte, aangezien de cursor wordt gebruikt terwijl de activiteit in gebruik blijft
onDestory
methode wordt gebruikt om de cursor te sluiten (cursors moeten altijd worden gesloten als u klaar bent met).
Dit is hoe het eruit ziet (niet mooi maar functioneel), met drie toegevoegde misdaden (de verwijderknop zou de De misdaad van de eeuw verwijderen misdaad). Als u lang op een misdaad in de lijst klikt, wordt die misdaad verwijderd. Als u op Toevoegen klikt, wordt er nog een item voor Misdaad van de Eeuw toegevoegd, tenzij de gegevens zijn gewijzigd.