@wojciechmaciejewski dzięki za cierpliwość do mnie. Naprawdę to doceniam. Przepraszam że drążę temat ale nie wystarczy mi że coś działa. Chcę się nauczyć naprawdę dobrze programować i robić to porządnie a nie byle jak, byle by działało. Powiem Ci jak działa obecnie mój kod.
Po wyborze "Delete" z menu, wywoływana jest metoda z klasy DatabaseHelperPlayers która na wejściu dostaje int-a i tym int-em jest ID pobrane z TextView z pozycji w którą kliknąłem. To ID to nie jest pozycja gracza na mojej liście tylko ID jakie on ma w bazie. I po tym ID wywoływana jest metoda delete po czym lista jest odświeżana, czyli wykonuje się kolejny select.
Tylko coś kurcze robię źle. Działać działa ale to nie może tak być. Jest do niczego :(:(:(:(. Pokażę co robię, jeśli będziesz miał chwilkę na zwrócenie mi uwagi gdzie robię błąd to było by super. Mam nadzieję że inni koledzy też pomogą. Nie czekam na gotowe rozwiązanie tylko jak widzicie sam też próbuję i staram się ogarnąć jak najwięcej.
Na początku dwie klasy, pierwsza z BaseAdapterem:
public class PlayerBaseAdapter extends BaseAdapter {
private List<ValuesPlayers> valuesPlayers;
private Context context;
private LayoutInflater inflater;
public PlayerBaseAdapter(List<ValuesPlayers> valuesPlayers, Context context) {
this.valuesPlayers = valuesPlayers;
this.context = context;
}
@Override
public int getCount() {
return valuesPlayers.size();
}
@Override
public Object getItem(int position) {
return valuesPlayers.get(position);
}
@Override
public long getItemId(int position) {
return valuesPlayers.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_players, null);
}
ValuesPlayers player = this.valuesPlayers.get(position);
TextView id = (TextView) view.findViewById(R.id.id);
TextView playerNameListView = (TextView) view.findViewById(R.id.playerNameListView);
id.setText(String.valueOf(player.getId()));
playerNameListView.setText(player.getNamePlayer());
return view;
}
static class ViewHolder {
TextView idPlayer, namePlayer;
}
}
następnie tzw klasa "entity":
public class ValuesPlayers {
private int id;
private String namePlayer;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNamePlayer() {
return namePlayer;
}
public void setNamePlayer(String namePlayer) {
this.namePlayer = namePlayer;
}
}
oraz mój select z klasy DatabaseHelperPlayers:
public List<ValuesPlayers> getAllPlayers() {
List<ValuesPlayers> playerList = new ArrayList<ValuesPlayers>();
SQLiteDatabase db = this.getReadableDatabase();
String sqlSelect = "SELECT " + _id + ", " +
columnPlayerName + " FROM " + TABLE_NAME;
Cursor select = db.rawQuery(sqlSelect, null);
if(select.moveToFirst()) {
do {
ValuesPlayers player = new ValuesPlayers();
player.setId(Integer.parseInt(select.getString(0)));
player.setNamePlayer(select.getString(1));
playerList.add(player);
}
while(select.moveToNext());
}
return playerList;
}
Dalej tworzę klasę do zarządzania graczami. Początek:
public class ManagePlayers extends AppCompatActivity {
DatabaseHelperPlayer playerDb = new DatabaseHelperPlayer(this);
ListView playersList;
int itemPos;
Teraz buduję metodę która wyświetli mi moją listę i tu chyba jest źle ponieważ tworzę listę pod którą którą przypisuję metodę getAllPlayers a klasy z bazą i na jej postawię buduję adapter:
private void playersListView() {
List<ValuesPlayers> allPlayers = playerDb.getAllPlayers();
playersList = (ListView) findViewById(R.id.listPlayer);
PlayerBaseAdapter adt = new PlayerBaseAdapter(allPlayers, getApplicationContext());
playersList.setAdapter(adt);
}
Następnie tworzę sobie menu kontekstowe gdzie do wcześniej zadeklarowanej zmiennej itemPos
przypisuję pozycję elementu na który kliknięto:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
itemPos = info.position;
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 0, "Delete");
}
Na końcu tworzę metodę onContextItemSeleceted
w której ponownie buduję listę do której przypisuję metodę pobierającą graczy z bazy z klasy do obsługi bazy a następnie pobieram ID z pozycji na którą kliknięto i daje je jako parametr dla metody deletePlayer:
@Override
public boolean onContextItemSelected(MenuItem item) {
List<ValuesPlayers> allPlayers = playerDb.getAllPlayers();
if(item.getTitle() == "Delete") {
ValuesPlayers id = allPlayers.get(itemPos);
int idPlayer = id.getId();
playerDb.deletePlayer(idPlayer);
playersListView();
}
return true;
}
Nie jest to dobrze. Świadczy o tym choćby to że w dwóch metodach tworzę tą samą listę. Ale nie wiem jak zrobić to prawidłowo :(:(.