Problem mit CustomAdapter

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:
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:
Ich habe mehrere Verständnisfragen.

a) Warum packst du die Items nicht in Array oder ArrayList? Es gibt auch die Möglichkeit, die Methode split() zu benutzen. (String | Android Developers)

b) Benutzt du ein AsyncTask für deinen BackgroundTask? Für länger laufende Tasks sollte man besser Threads benutzen. Wenn der foobar auch funktionieren soll, wenn die App im Hintergrund ist, wäre ein Thread in einen Service eine gute Wahl.

c) Der ist Code ist stark fragmentiert, aber soweit ich es sehe, rufst du den BackgroundTask zweimal auf, für jedes item einmal.
D.H. der zweite überschreibt den ersten.
 
markus.tullius schrieb:
a) Warum packst du die Items nicht in Array oder ArrayList? Es gibt auch die Möglichkeit, die Methode split() zu benutzen. (String | Android Developers)
Die Favoriten Items sollen in die ArrayList "favList" gepackt werden. (Siehe Methode "addPartyFav")

markus.tullius schrieb:
b) Benutzt du ein AsyncTask für deinen BackgroundTask? Für länger laufende Tasks sollte man besser Threads benutzen. Wenn der foobar auch funktionieren soll, wenn die App im Hintergrund ist, wäre ein Thread in einen Service eine gute Wahl.
Ja ich verwende AsyncTask. Der Task läuft ja nicht lange. Er wird nur kurz aufgerufen, um die Daten der MySQL Datenbank auszulesen und die Ausgabe mit Hilfe von JSON an die Hauptklasse zu übergeben.

markus.tullius schrieb:
c) Der ist Code ist stark fragmentiert, aber soweit ich es sehe, rufst du den BackgroundTask zweimal auf, für jedes item einmal.
D.H. der zweite überschreibt den ersten.
Ja BackgroundTask wird so oft aufgerufen, wie Favoriten Items vorhanden sind. Für jedes Item wird es ein Mal aufgerufen. Jedoch wird auch für jedes Item ein neuer BackgroundTask erstellt. Und es kann nicht sein, dass das zweite Item das Erste überschreibt. Wenn die Items in folgender Reihenfolge geladen werden sollen: Item mit ID 1, Item mit ID 2; dann werden beide Items in der Favoriten ListView angezeigt. Allerdings erhalte ich bei der Ausgabe von PartyAdapter, dass zwei Mal das Item mit ID 1 hinzugefügt wurde.
 
Zuletzt bearbeitet:
Bearbeitet von: u.k-f - Grund: Unnötiges, direkt Zitat des vorherigen Beitrages entfernt. Bitte nicht mehr machen!

Ähnliche Themen

A
Antworten
10
Aufrufe
1.021
swa00
swa00
J
Antworten
5
Aufrufe
929
swa00
swa00
D
Antworten
9
Aufrufe
1.765
jogimuc
J
Zurück
Oben Unten