Android DialogFragment mit SimpleCursorAdapter: Auf Daten zugreifen?

kurztipp

Aktives Mitglied
Hallo,

ich möchte den User per DialogFragment/AlertDialog aus einer Liste ein Item auswählen lassen. Die Liste mit eigenem Layout steht und wird angezeigt, soweit alles gut. Aber ich habe keine Ahnung, wie ich auf das ausgewählte Item zugreifen soll.
Bei einer ListActivity, die mit einem SimpleCursorAdapter mit Daten aus einer Datenbank gefüllt wurde, habe ich die Möglichkeit per
Code:
onListItemClick(ListView l, View v, int position, long id)
die ID des angeklickten Items abzurufen.
DialogFrament bietet mir aber nur
Code:
onClick(DialogInterface dialog, int which)
an, womit ich die Nummer des angeklickten Buttons erhalte, die eben nicht die ID des jeweiligen Items ist.

Die Frage ist also, wie ich entweder einen onListItemClickListener einbinden oder über die Nummer aus which auf die ID zugreifen kann, damit ich mit dieser ID weiterarbeiten kann?

Mein DialogFragment, falls das von Interesse ist.
Java:
public class SingleCoiceListDialogFragment extends DialogFragment {

	SimpleCursorAdapter mAdapter;

	/* The activity that creates an instance of this dialog fragment must
	 * implement this interface in order to receive event callbacks. */
	public interface SingleChoiceListener {
		public void onItemSelected(DialogFragment dialog, int which);
		public void onListItemClick(ListView l, View v, int position, long id);
	}

	// Use this instance of the interface to deliver action events
	SingleChoiceListener mSingleChoiceListener;

	// Override the Fragment.onAttach() method to instantiate the listener
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		// Verify that the host activity implements the callback interface
		try {
			// Instantiate the listener so we can send events to the host
			mSingleChoiceListener = (SingleChoiceListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement NoticeDialogListener");
		}

	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		LayoutInflater layoutInflater = getActivity().getLayoutInflater();
		Bundle args = getArguments();
		
		DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				// The 'which' argument contains the index position
				// of the selected item
				mSingleChoiceListener.onItemSelected(SingleCoiceListDialogFragment.this, which);
			}
		};
		
		Log.i("fragment", String.valueOf(args.containsKey("title")));
		builder.setTitle(args.getString("title"));
		
		builder.setView(layoutInflater.inflate(args.getInt("layout"), null));
		
		builder.setAdapter(mAdapter, onClickListener);
		
		return builder.create();
	}
	
	public void setAdapter(SimpleCursorAdapter adapter) {
		mAdapter = adapter;
	}
 

dzim

Top Contributor
Da ich selbst gerade kein Beispiel dafür habe, würde ich spontan sagen, dass du entweder auf dem Adapter (geht das überhaupt?) einen Listener setzen musst, oder aber (das glaube ich ist deine Variante) auf dem ListView der in dem AlertDialog steckt...

Ich hab noch kurz ausprobiert: Dort gibt es [c]diaog.getListView().setOnItemClickListener(listener);[/c]. Sollte also gehen!

Wo du deinen Listener reingehängt hast, ist für die default-Buttons des AlertDialogs.
 

kurztipp

Aktives Mitglied
Hallo,

getListView() ist schonmal eine große Hilfe. Ich habe jetzt:
Java:
public Dialog onCreateDialog(Bundle savedInstanceState) {
//...
		AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
				// The 'which' argument contains the index position
				// of the selected item
				mSingleChoiceListener.onListItemClick(parent, v, position, id);
			}
		};

		AlertDialog dialog = builder.create();
		dialog.getListView().setOnItemClickListener(onItemClickListener);

		return dialog;
}
Und mit
Java:
@Override
	public void onListItemClick(AdapterView<?> parent, View v, int position, long id) {
		Log.i("", String.valueOf(id));
	}
Bekomme ich auch die ID des angeklickten Elements, aber scheinbar ist das Standardverhalten bei einem Klick dadurch zerstört worden, denn der Dialog schließt sich nicht nicht mehr.
Eventuell, da onItemSelected nicht mehr aufgerufen wird und der Dialog nicht mitbekommt, dass durch den das Element abschließend ausgewählt wurde?

[EDIT]Wäre der zusätzliche Aufruf von
Code:
mSingleChoiceListener.onItemSelected();
ein Lösungsansatz? Leider weiß ich nicht, woher ich das DialogFragment bekomme, das ich hierfür übergeben muss.[/EDIT]

[EDIT]
Code:
mSingleChoiceListener.onItemSelected((DialogFragment) getParentFragment(), position);
Lässt mich onItemSelected aufrufen, allerdings hilft mir das nicht weiter, da der Dialog nicht geschlosen wird. Ich könnte jetzt noch ein
Code:
dismiss();
in den Listener schreiben, aber ich weiß nicht, ob das von Android so vorgesehen ist?[/EDIT]
 
Zuletzt bearbeitet:

dzim

Top Contributor
Es gibt auf der ListView auch ein onItemSelected - häng da einfach deinen onItemSelected-Listener rein, wie zuvor bei onItemClick. Das DialogFragemt wäre dann SingleCoiceListDialogFragment.this für den Aufruf [c]mSingleChoiceListener.onItemSelected(SingleCoiceListDialogFragment.this, position);[/c] idealerweise rufst du in einer der beiden Listener dann "einfach" noch [c]SingleCoiceListDialogFragment.this.getDialog().dismiss();[/c] auf - das ist wie ein Klick auf OK.
Am besten machst du das bei onItemClick.

Also:
Java:
public Dialog onCreateDialog(Bundle savedInstanceState) {

        AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // The 'which' argument contains the index position
                // of the selected item
                mSingleChoiceListener.onListItemClick(parent, v, position, id);
                SingleCoiceListDialogFragment.this.getDialog().dismiss();
            }
        };
 
        AlertDialog dialog = builder.create();
        dialog.getListView().setOnItemClickListener(onItemClickListener);
 
        return dialog;

Das wären jetzt jedenfalls meine pragmatischen (und ungetesteten) Ansätze.

Ich hab jetzt noch mal geschaut: Ich hab das mal in einem Dialog mit Radio-Boxen so geregelt, dass ich den Dialog nicht in seinen eigenen Listenern (also wie oben gezeigt) geschlossen habe, sondern in denen, die ich reinreiche.
Will heißen, du kannst das [c]dialog.dismiss()[/c] auch von in der Implementierung deines SingleChoiceListener machen - aber auch hier würde ich es nur bei einem der Listener machen (sie machen potentiell beide eh das Selbe!).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Android DialogFragment eigene Argumente per Bundle übergeben Android & Cross-Platform Mobile Apps 4
K Android ListFragment per SimpleCursorAdapter automatisch neufüllen Android & Cross-Platform Mobile Apps 6
M Firebase RealtimeDatabase - Daten aus Queries in CSV File speichern Android & Cross-Platform Mobile Apps 1
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
N XY-Plot plottet keine Daten Android & Cross-Platform Mobile Apps 0
W Background Service Daten verarbeiten/Schleife ect. Android & Cross-Platform Mobile Apps 1
R Android Daten speichern und anzeigen Android & Cross-Platform Mobile Apps 7
MiMa Daten vom Brustgurt bekommen? Android & Cross-Platform Mobile Apps 3
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
W Android Browser startet immer, bevor die Daten dafür geholt wurden Android & Cross-Platform Mobile Apps 15
J Android Server-Login Daten in der App sicherer hinterlegen? Android & Cross-Platform Mobile Apps 7
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
L Android Daten von Webseite runterladen, die mit HTTP-Authentifizierung gesichert ist Android & Cross-Platform Mobile Apps 5
B Accelerometer daten umwandeln Android & Cross-Platform Mobile Apps 41
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
A Android Daten in der Cloud speichern (Google) Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
M Anzeigen der Daten dauert zu lange - Progressdialog? Android & Cross-Platform Mobile Apps 5
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
B Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird? Android & Cross-Platform Mobile Apps 21
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G Wie gebe ich dem DrawView die Daten mit? Android & Cross-Platform Mobile Apps 2
V App Daten in Java Applikation Android & Cross-Platform Mobile Apps 3
D Android Daten verwalten Android & Cross-Platform Mobile Apps 2
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
M Android Von Smartphone auf Daten von Server zugreifen Android & Cross-Platform Mobile Apps 2
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
L Android Einlesen und rausschreiben von Daten auf SD Android & Cross-Platform Mobile Apps 3
U Android Daten dauerhaft speichern? Android & Cross-Platform Mobile Apps 2
P Java ME benutzer daten speichern Android & Cross-Platform Mobile Apps 5
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
X RMS - Will die Daten auf den PC kopieren Android & Cross-Platform Mobile Apps 3
B Daten in *.txt schreiben Android & Cross-Platform Mobile Apps 7
R Lesen und schreiben von Daten. Android & Cross-Platform Mobile Apps 2
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
O eingehende Daten speichern Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben