Wpis z mikrobloga

#programowanie #android #androiddev
Mireczki stworzyłem aplikację opartą o google maps api w której m.in dodaje się swoje miejsca do bazy danych i mam dwa problemy. W sekcji moje miejsca mam ListView z klikalnymi TextViewami z miejscami pobranymi z bazy danych oraz przyciskiem który odpowiada za usunięcie rekordu z bazy danych. Tutaj rodzi się moje pytanie w jaki sposób zaprogramować ten przycisk aby usuwał rekord z bazy danych. Korzystam z kursor adaptera i w metodzie BindView dodaje clickListenera do tego przycisku. Nie wiem kompletnie jak z CursorAdaptera dostać się do bazy danych, bo żeby stworzyć obiekt klasy SQLLiteOpenHelper trzeba przekazać context. Następne problem to przewijanie mapy po kliknięciu w textView, chciałbym aby po kliknięciu mapa przechodziłą na współrzędne pobrane z bazy. Da się jakoś zamknąć fragment i jednocześnie przekazać jakie współrzędne do głównej aktywności?
  • 10
@tusk: po sposobie opisu wnioskuję, że masz skopiowaną apkę i chcesz ją trochę przerobić

1. context masz dostępny w Activity (dziecziczy ono po Context), a jeśli chcesz w adapterze to przekaż np w konstruktorze
2. do komunikacji fragment -> activity posłuż się interfejsem, tj:
a) zdefiniuj nowy interfejs MojListener
b) zaimplementuj go w activity
c) w fragencie w wybranej akcji możesz go wywołać: ((MojListener)getActivity()).mojaAkcja()
@qmar: Sam wszystko pisałem, jednak we wszystkich przykładach użycia CursorAdaptera był taki sam konstruktor i myślałem że musi być taki, dzięki za oświecenie. Co do odpowiedzi na drugie pytanie mógłbyś trochę jaśniej? Ten interfejs ma pozostać pusty i będzie służył jedynie do wywołania metody z Aktywności?
@qmar: @simpleman: Poradziłem sobie z przekazaniem danych w konstruktorze jednak chyba źle rozumiem logikę działania kursor adaptera. Mam taki kod obsługi przycisku w bindView

ImageButton deleteButton = (ImageButton) view.findViewById(R.id.deleteButton);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
manager.deleteItem(mCursor.getInt(0));
System.out.println("id z cursora " + mCursor.getInt(0));
mCursor.requery();
notifyDataSetChanged();

}
});

manager to obiekt klasy pomocnika bazy w której jest metoda usuwająca rekordy z bazy, jednak jakiego przycisku bym nie kliknął to
Jedyne co mi przychodzi do głowy to nadanie przyciskowi takiego samego id jak ma odpowiadający mu rekord i przy wywolaniu przyciski pobieranie jego id.
Rozumiem ze potrzebujesz do szczescia wartosci ID aby moc usunac wlasciwy rekord. Generalnie ustawianie onClickListenera w adapterze jest kiepskim pomyslem, gdyz nie masz dostepu do pozycji View na rzecz ktorego klikniecie mialo miejsce. Jesli bardzo chcesz to mozesz uzyc metod setTag/getTag na rzecz View.
Np w trakcie bindowania zrobic cos takeigo:

view.setTag("ID", cursor.getLong(cursor.getColumnIndex(Table._ID)));
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
long id = view.getTag("ID");
}
});

Jesli jednak dane z
@simpleman: Jeszcze jedno pytanie odnośnie dodawania clickListenera w BindView i definiowanie interfejsu aby wywołać metodę głównej aktywności. W jaki sposób dostać się z BindView do obiektu fragmentu w którym znajduje się listView?

titleText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

updater.updateCamera(latLng);
}
});

updater to referencja do mojego interfejsu, a updateCamera to metoda implementowana w aktywności. Jednak w jaki sposób dostać się do tego interfejsu z bindView? gdy próbowałem przez
Zdefiniuj w adapterze interfejs, dodaj pole z interfejsem i settera do interfejsu

// ADAPTER

public interface OnCameraUpdateListener {
public void onCameraUpdate();
}

private OnCameraUpdateListener mCameraUpdateListener;

public setOnCameraUpdateListener(OnCameraUpdateListener listener) {
mCameraUpdateListener = listener;
}

// FRAGMENT

Zaimplementuj interfejs we fragmencie i przekaz go do adaptera:

public class FragmentA extends ListFragment implements OnCameraUpdateListener {

@Override
public vodi onCreate() {
mAdapter.setOnCameraUpdateListener(this);
}

@Override
public void onCameraUpdate() {
// akcja do wykonania
}


}

Pozostalo w