D
DrLiightninG
Neues Mitglied
- 1
Hallo zusammen,
ich habe es nun endgültig geschafft, eine fertige ListView mit Daten aus meiner MySQL Datenbank zu erstellen.
Nun wollte ich dem Benutzer die Möglichkeit geben, ausgewählte Items aus der ListView unter seinen Favoriten zu speichern und dort ebenfalls in einer ListView anzeigen zu lassen. Dazu habe ich einen String, der die ID der Items aneinander reiht (durch Kommata getrennt). Dieser String wird dann nach und nach ausgelsen (immer bis zum nächsten Komma) und die IDs werden in der Datenbank gesucht, geladen und in der Favoriten ListView angezeigt. Soweit klappt alles.
Nun jedoch folgendes Problem:
Ich habe noch eine ArrayList erstellt, welche die Favoriten Items speichert, sodass ich leichter auf die IDs der Favoriten zugreifen kann. Diese ArrayList hat jedoch anscheinend die size=0. In der normalen ListView (hier werden alle Items angezeigt) sollen nämlich die Favoriten Items hervorgehoben werden. Dies funktioniert jedoch nicht.
Ebenso scheint ein Fehler in meinem PartyAdapter zu sein, da ich dort nach dem Einfügen zweier Items in die Favoriten Liste, immer nur die ID des als ersten eingefügten Items erhalte. Es werden jedoch beide verschiedenen Items in der Favoriten Liste angezeigt.
Hier meine Code Ausschnitte:
Laden der Favoriten Items aus der MySQL Datenbank:
Methode "getFavoriteParty(String string)":
Ausschnitt aus BackgroundTask (Auslesen der MySQL Daten):
Bearbeitung der JSON Ausgabe und Erstellung der ListView Items:
Die Methode addPartyFav(PartyItem pItem):
Die Klasse PartyItem (Item aus der ListView):
Die Klasse PartyAdapter (Adapter der ListViews):
Ich hoffe mir kann mal wieder jemand helfen..
Gruß
Jan
ich habe es nun endgültig geschafft, eine fertige ListView mit Daten aus meiner MySQL Datenbank zu erstellen.
Nun wollte ich dem Benutzer die Möglichkeit geben, ausgewählte Items aus der ListView unter seinen Favoriten zu speichern und dort ebenfalls in einer ListView anzeigen zu lassen. Dazu habe ich einen String, der die ID der Items aneinander reiht (durch Kommata getrennt). Dieser String wird dann nach und nach ausgelsen (immer bis zum nächsten Komma) und die IDs werden in der Datenbank gesucht, geladen und in der Favoriten ListView angezeigt. Soweit klappt alles.
Nun jedoch folgendes Problem:
Ich habe noch eine ArrayList erstellt, welche die Favoriten Items speichert, sodass ich leichter auf die IDs der Favoriten zugreifen kann. Diese ArrayList hat jedoch anscheinend die size=0. In der normalen ListView (hier werden alle Items angezeigt) sollen nämlich die Favoriten Items hervorgehoben werden. Dies funktioniert jedoch nicht.
Ebenso scheint ein Fehler in meinem PartyAdapter zu sein, da ich dort nach dem Einfügen zweier Items in die Favoriten Liste, immer nur die ID des als ersten eingefügten Items erhalte. Es werden jedoch beide verschiedenen Items in der Favoriten Liste angezeigt.
Hier meine Code Ausschnitte:
Laden der Favoriten Items aus der MySQL Datenbank:
Code:
gpartyList = (ListView) rootView.findViewById(R.id.list);
//partyList.setClickable(true);
gpartyList.setItemsCanFocus(true);
gpartyAdapter = new PartyAdapter(getActivity(),R.layout.list_item_new);
gpartyAdapter.setAct(this);
gpartyList.setAdapter(gpartyAdapter);
gpartyList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(getActivity().getApplicationContext(), "Clicked",
Toast.LENGTH_SHORT).show();
}
});
favString = "1,2,"; //Dies ist der global erstellte Favoriten String. Die Items mit der ID 1 und 2 sind also Favoriten
String tempS = "";
for(int i = 0; i < favString.length(); i++) { //Die Schleife liest nacheinander die Daten aus der Datenbank aus. Die JSON Ausgabe liefert immer nur ein Objekt. Somit muss jedes Item einzeln ausgelesen werden
if(favString.charAt(i) == ',') {
if(!tempS.equals("")) {
this.getFavoriteParty(tempS); //Party mit ID=tempS wird aus Datenbank geladen. Somit erst ID 1 und dann ID 2
tempS = "";
continue;
}
continue;
}
else {
tempS = tempS + favString.charAt(i);
}
}
Methode "getFavoriteParty(String string)":
Code:
public void getFavoriteParty(String string) {
String method = "favSuchen";
BackgroundTask backgroundTask = new BackgroundTask(getActivity());
backgroundTask.setOutputActivity(this); //Die aktuelle Klasse wird übergeben, um später von BackgroudTask hierrauf zugreifen zu können, um die JSON Ausgabe zu übergeben.
backgroundTask.execute(method,string);
}
Ausschnitt aus BackgroundTask (Auslesen der MySQL Daten):
Code:
//.....
else if(method.equals("favSuchen")) {
String id = params[1];
try {
favsuchen = true;
URL url = new URL(favsuchen_url);
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream OS = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8"));
String data = URLEncoder.encode("party_id","UTF-8") + "=" + URLEncoder.encode(id,"UTF-8");
bufferedWriter.write(data);
bufferedWriter.flush();
bufferedWriter.close();
OS.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String JSON_STRING;
while ((JSON_STRING = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_STRING+"\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String result) {
//.....
else { //Übergabe der JSON Ausgabe an MainActivity.PlaceholderFragment
jString = result;
activity.setzeString(2,jString);
}
}
Bearbeitung der JSON Ausgabe und Erstellung der ListView Items:
Code:
public void setzeString(int pI, String str) {
json_string = str;
this.parseJSON(pI);
}
public void parseJSON(int pI) {
if (pI == 1) { //Hier werden die Items für die normale ListView erstellt
if (json_string == null) {
Toast.makeText(getActivity().getApplicationContext(), "Keine Partys gefunden", Toast.LENGTH_LONG).show();
} else { //Suchergebnisse anzeigen
//aktualisierenB.setText(json_string);
//Toast.makeText(getActivity().getApplicationContext(), "Partys geladen",Toast.LENGTH_SHORT).show();
if (aktualisiert == true) {
aktualisiert = false;
Toast.makeText(getActivity().getApplicationContext(), "Partys aktualisiert",
Toast.LENGTH_SHORT).show();
}
JSONObject jsonObject;
JSONArray jsonArray;
String partyName;
String clubName;
String veranstalter;
String datum;
String zeit;
String adresse;
String stadt;
String plz;
String ticketverkauf;
String age;
int zusagen;
int id;
int count = 0;
try {
jsonObject = new JSONObject(json_string);
jsonArray = jsonObject.getJSONArray("server_response");
while (count <= jsonObject.length()) {
JSONObject JO = jsonArray.getJSONObject(count);
partyName = JO.getString("party_name");
clubName = JO.getString("club_name");
veranstalter = JO.getString("veranstalter");
datum = JO.getString("datum");
zeit = JO.getString("zeit");
adresse = JO.getString("adresse");
stadt = JO.getString("stadt");
plz = JO.getString("plz");
ticketverkauf = JO.getString("ticketverkauf");
age = JO.getString("age");
id = JO.getInt("id");
zusagen = JO.getInt("zusagen");
PartyItem partyItem;
boolean found = false;
for(int i = 0; i < favList.size(); i++) { //Schleife wird anscheinend immer übersprungen
PartyItem pItem = (PartyItem)favList.get(i);
Toast.makeText(getActivity().getApplicationContext(), "Party ID: " + pItem.getPartyID(),Toast.LENGTH_LONG).show();
if(pItem.getPartyID() == id) {
found = true;
break;
}
}
Toast.makeText(getActivity().getApplicationContext(), "FavList Länge: " + favList.size(),Toast.LENGTH_LONG).show(); //Hier bekomme ich immer 0 als Länge ausgegeben
if(found) { //Ist anscheinend nie der Fall. Jedoch müsste die bei den Items mit ID 1 und 2 der Fall sein
partyItem = new PartyItem(id, partyName, clubName, zeit, adresse,true);
Toast.makeText(getActivity().getApplicationContext(), "Gemerkte Party eingefügt",Toast.LENGTH_LONG).show();
partyAdapter.add(partyItem);
count++;
}
else {
partyItem = new PartyItem(id, partyName, clubName, zeit, adresse,false);
Toast.makeText(getActivity().getApplicationContext(), "Nicht gemerkte Party eingefügt",Toast.LENGTH_LONG).show(); //Immer der Fall
partyAdapter.add(partyItem);
count++;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} else { //Hier werden die Favoriten Items geladen
if (json_string == null) {
//Toast.makeText(getActivity().getApplicationContext(), "Keine gemerkten Partys gefunden",Toast.LENGTH_LONG).show();
sectionLabel.setVisibility(View.VISIBLE);
} else { //Suchergebnisse anzeigen
//aktualisierenB.setText(json_string);
//Toast.makeText(getActivity().getApplicationContext(), "Gemerkte Partys geladen", Toast.LENGTH_SHORT).show();
sectionLabel.setVisibility(View.INVISIBLE);
JSONObject jsonObject;
JSONArray jsonArray;
String partyName;
String clubName;
String veranstalter;
String datum;
String zeit;
String adresse;
String stadt;
String plz;
String ticketverkauf;
String age;
int zusagen;
int id = 0;
int count = 0;
try {
jsonObject = new JSONObject(json_string);
jsonArray = jsonObject.getJSONArray("server_response");
while (count <= jsonObject.length()) {
JSONObject JO = jsonArray.getJSONObject(count);
partyName = JO.getString("party_name");
clubName = JO.getString("club_name");
veranstalter = JO.getString("veranstalter");
datum = JO.getString("datum");
zeit = JO.getString("zeit");
adresse = JO.getString("adresse");
stadt = JO.getString("stadt");
plz = JO.getString("plz");
ticketverkauf = JO.getString("ticketverkauf");
age = JO.getString("age");
id = JO.getInt("id");
zusagen = JO.getInt("zusagen");
PartyItem partyItem = new PartyItem(id, partyName, clubName, zeit, adresse,true);
this.addPartyFav(partyItem); //Das Item wird zur Favoriten ArrayList hinzugefügt
Toast.makeText(getActivity().getApplicationContext(), "Party auf Merkliste eingefügt (ID: " + id + ")", Toast.LENGTH_LONG).show(); //Diese Ausgabe funktioniert richtig. Hier bekomme ich die IDs 1 und 2 als Ausgabe
gpartyAdapter.add(partyItem); //Einfügung in den Adapter und die ListView
count++;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
Die Methode addPartyFav(PartyItem pItem):
Code:
public void addPartyFav(PartyItem pItem) {
Toast.makeText(getActivity().getApplicationContext(), "addPartyFav (ID: " + pItem.getPartyID() + ")",Toast.LENGTH_LONG).show();
favList.add(pItem);
favString = "";
PartyItem pI;
for(int i = 0; i < favList.size(); i++) {
pI = (PartyItem) favList.get(i);
favString = favString + pI.getPartyID() + ",";
}
Toast.makeText(getActivity().getApplicationContext(), "FavString: " + favString,Toast.LENGTH_LONG).show(); //Der String sieht so aus: "FavString: 1,2," (Wird also richtig erstellt). Entferne ich jedoch eine Favoriten Party (Egal ob ID 1 oder 2), so sieht er so aus: "FavString: 2,". Dies deutet ebenfalls auf einen Fehler in PartyAdapter hin
Die Klasse PartyItem (Item aus der ListView):
Code:
public class PartyItem {
private String partyName;
private String partyClub;
private String partyZeit;
private String partyAdresse;
private int partyID;
private boolean fav;
public PartyItem(int pID, String pName, String pClub, String pZeit, String pAdresse, boolean pFav) {
this.setPartyID(pID);
this.setPartyName(pName);
this.setPartyClub(pClub);
this.setPartyZeit(pZeit);
this.setPartyAdresse(pAdresse);
this.setPartyFav(pFav);
}
public void setPartyFav(boolean pFav) {
fav = pFav;
}
public boolean getPartyFav() {
return fav;
}
public void setPartyName(String pName) {
partyName = pName;
}
public void setPartyID(int pID) {
partyID = pID;
}
public void setPartyClub(String pClub) {
partyClub = pClub;
}
public void setPartyZeit(String pZeit) {
partyZeit = pZeit;
}
public void setPartyAdresse(String pAdresse) {
partyAdresse = pAdresse;
}
public String getPartyName() {
return partyName;
}
public int getPartyID() {
return partyID;
}
public String getClubName() {
return partyClub;
}
public String getPartyZeit() {
return partyZeit;
}
public String getPartyAdresse() {
return partyAdresse;
}
}
Die Klasse PartyAdapter (Adapter der ListViews):
Code:
public class PartyAdapter extends ArrayAdapter{
List list = new ArrayList();
MainActivity.PlaceholderFragment act;
PartyItem partyItem;
public PartyAdapter(Context context, int resource) {
super(context, resource);
}
public void setAct(MainActivity.PlaceholderFragment pAct) {
act = pAct;
}
public void add(PartyItem object) {
super.add(object);
list.add(object);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
row = convertView;
final ItemHolder itemHolder;
partyItem = (PartyItem) this.getItem(position);
if(row == null) {
LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.list_item_new,parent,false);
itemHolder = new ItemHolder();
itemHolder.name_tv = (TextView) row.findViewById(R.id.party_name);
itemHolder.adresse_tv = (TextView) row.findViewById(R.id.party_adresse);
itemHolder.zeit_tv = (TextView) row.findViewById(R.id.party_zeit);
itemHolder.club_tv = (TextView) row.findViewById(R.id.party_club);
itemHolder.addfav_b = (ImageView) row.findViewById(R.id.fav_b);
itemHolder.fav = partyItem.getPartyFav();
itemHolder.id = partyItem.getPartyID();
itemHolder.item = (PartyItem) this.getItem(position);
Toast.makeText(getContext(), "Party mit ID " + itemHolder.item.getPartyID() + " zum Adapter", Toast.LENGTH_LONG).show(); //Hier bekomme ich immer ID 1 ausgegeben, wenn Favoriten Items hinzugefügt werden. Bei der Erstellung der Favoriten ListView habe ich hier also zwei Mal die Ausgabe mit ID 1. Dabei müsste es eigentlich ID 1 und 2 sein. Bei der Erstellung der normalen ListView bekomme ich die richtigen zwei Ausgaben. Also da funktioniert es, dass erst ID 1 und dann 2 ausgegeben werden
if(itemHolder.fav) {
itemHolder.addfav_b.setImageResource(R.drawable.fav);
}
itemHolder.addfav_b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
if(!itemHolder.fav) {
itemHolder.fav = true;
act.addPartyFav(itemHolder.item);
itemHolder.addfav_b.setImageResource(R.drawable.fav);
Toast.makeText(getContext(), "" + itemHolder.name_tv.getText() + " zu gemerkten Partys hinzugefügt (ID: " + itemHolder.id + ")", //Hier bekomme ich immer den richtigen Namen
Toast.LENGTH_LONG).show();
}
else {
itemHolder.fav = false;
act.removePartyFav(itemHolder.item);
itemHolder.addfav_b.setImageResource(R.drawable.addfavbunt);
Toast.makeText(getContext(), "" + itemHolder.name_tv.getText() + " von gemerkten Partys entfernt (ID: " + itemHolder.id + ")", //Hier ebenfalls immer die richtigen Namen
Toast.LENGTH_LONG).show();
}
}
});
row.setTag(itemHolder);
} else {
itemHolder = (ItemHolder) row.getTag();
}
//partyItem = (PartyItem)this.getItem(position);
itemHolder.name_tv.setText(partyItem.getPartyName());
itemHolder.club_tv.setText(partyItem.getClubName());
itemHolder.adresse_tv.setText(partyItem.getPartyAdresse());
itemHolder.zeit_tv.setText(partyItem.getPartyZeit());
return row;
}
static class ItemHolder {
TextView name_tv, zeit_tv, adresse_tv, club_tv;
//ImageButton addfav_b;
ImageView addfav_b;
int id;
boolean fav;
PartyItem item;
}
}
Ich hoffe mir kann mal wieder jemand helfen..
Gruß
Jan
Zuletzt bearbeitet: