4 Stimmen

Wie kann man den Wert von onChildClick aus ExpandableListView in Android erhalten?

Ich arbeite an einem Projekt, bei dem JSON von einer URL in ExpandableListView geparst wird. Abhängig vom Wert des Tags "status" (aktiv oder ausstehend) werden Datensätze entsprechend den verschiedenen Gruppen "Active" und "Pending" platziert. Alles funktioniert gut.

Mein Problem ist, wenn ich auf ein Element innerhalb der zweiten Gruppe klicke, das unterschiedliche Daten anzeigen sollte, erhalte ich die Daten des Elements aus der ersten Gruppe.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ListView;
importandroid.widget.SimpleExpandableListAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnGroupClickListener;

public class ExpandableActivity1 extends ExpandableListActivity {
    JSONArray jArray = null;
    JSONObject json_data = null;
    TextView txtMLSID;
    List> child1;
    List> child2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        List> groups = new ArrayList>();
        Map group1 = new HashMap();
        group1.put("group", "Aktiv");
        groups.add(group1);
        Map group2 = new HashMap();
        group2.put("group", "Ausstehend");
        groups.add(group2);
        child1 = new ArrayList>();
        child2 = new ArrayList>();

        String url ="http://stage.realtylog.net/iPhone/functions.php?username=hussain16&act=listing";

        String  json = JSONfunctions.getJSONfromURL(url);

        try {
            jArray = new JSONArray(json);

            for(int i=0; i childdata1 = new HashMap();
                JSONObject e = jArray.getJSONObject(i);
                String status = e.getString("2");
                Log.e("log_tag", "Status: " + status);

                if (status.contains("active")) {
                    Log.e("log_tag", "StatusActive: " + status);
                    childdata1.put("0", String.valueOf(i+1) + " " + e.getString("mlsid"));
                    child1.add(childdata1);
                } else if (status.contains("pending")) {
                    Log.e("log_tag", "StatusPending: " + status);
                    Map childdata2 = new HashMap();
                    childdata2.put("0", String.valueOf(i+1) + " " + e.getString("mlsid"));
                    child2.add(childdata2);
                }
            }
        } catch (JSONException e) {
            Log.e("log_tag", "Fehler beim Parsen der Daten " + e.toString());
        }

        List>> childs = new ArrayList>>();
        childs.add(child1);
        childs.add(child2);

        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
            this, groups, R.layout.groups, new String[] { "group" },
            new int[] { R.id.group }, childs, R.layout.childs,
            new String[] { "0" }, new int[] { R.id.child });
        setListAdapter(adapter);
    }

    @Override
    public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) {
        //do something
        Log.e("log_tag", "setSelectedChild: ");
        return super.setSelectedChild(groupPosition, childPosition, shouldExpandGroup);
    }

    @Override
    public void setSelectedGroup(int groupPosition) {
        //do something
        Log.e("log_tag", "setSelectedGroup: ");
        super.setSelectedGroup(groupPosition);
    }

    // Hier tritt das Problem auf

    @SuppressWarnings("unchecked")
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
        Log.d("LOG_TAG", "onChildClick: " + "GRUPPE: " + groupPosition + "   KIND Position:  " + childPosition);
        HashMap o = (HashMap) parent.getItemAtPosition(childPosition+1);
        String val = o.get("0");
        Log.d("LOG_TAG", "ausgewählter Wert: " + val);
        return false;
    }
}

LogCat-Info, wenn die Methode public boolean onChildClick () aufgerufen wird:

10-20 11:24:28.004: DEBUG/LOG_TAG(1652): onChildClick: GRUPPE: 0   KIND Position:  0
10-20 11:24:28.004: DEBUG/LOG_TAG(1652): ausgewählter Wert: 1 555
10-20 11:24:42.454: DEBUG/LOG_TAG(1652): onChildClick: GRUPPE: 1   KIND Position:  0
10-20 11:24:42.454: DEBUG/LOG_TAG(1652): ausgewählter Wert: 1 555

Der Logcat zeigt, dass ich denselben Wert für Gruppe 1 (Aktiv) und Gruppe 2 (Ausstehend) erhalte.

Ich benötige spezifische Werte für jedes Kind basierend auf dem Klick.

14voto

Lalit Poptani Punkte 66548

Du musst die Methode getChild(groupPosition, childPosition) des Adapters verwenden, um die Instanz des Kindes abzurufen und sie dann in deine Map umwandeln, um sie zum Laufen zu bringen.

@Override
public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) {

    Toast.makeText(this, (String)((Map)
                adapter.getChild(groupPosition, childPosition)).get("lalit"),
                                                      Toast.LENGTH_LONG).show();
    return super.onChildClick(parent, v, groupPosition, childPosition, id);
}

3voto

Piraba Punkte 6774

Versuchen Sie dies:

@Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

    String title = ((TextView) info.targetView).getText().toString();

    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    System.out.println(" ----- " + type);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
        Toast.makeText(this,title + ": Kind " + childPos + " in Gruppe "+ groupPos + " geklickt", Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        Toast.makeText(this, title + ": Gruppe " + groupPos + " geklickt",Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

2voto

JRomero Punkte 4768

Das untenstehende ist nicht perfekt, aber es funktioniert. Es könnte hilfreich sein für diejenigen, die auf die Ansicht zugreifen müssen, ohne die onChildClick-Methode außer Kraft zu setzen, z. B. ein benutzerdefinierter Dialog mit einem ExpandableListView.

    ExpandableListView ellQuickKeys = (ExpandableListView) layout.findViewById(R.id.ellQuickKeys);

    SimpleExpandableListAdapter expListAdapter =
            new SimpleExpandableListAdapter(
                            this,
                            createGroupList(),                              // Erstellen der Gruppenliste.
                            R.layout.group_row,                             // Layout für Gruppenelemente.                        
                            new String[] { "Group Item" },  // Der Schlüssel des Gruppenelements.
                            new int[] { R.id.row_name },    // ID jedes Gruppenelements. Die Daten unter dem Schlüssel gehen in diesen TextView.
                            createChildList(),                              // childData beschreibt Einträge der zweiten Ebene.
                            R.layout.child_row,                             // Layout für Untereinträge (zweite Ebene).
                            new String[] {"Sub Item"},              // Schlüssel in childData, die angezeigt werden sollen.
                            new int[] { R.id.lblChildText}             // Daten unter den obigen Schlüsseln gehen in diese TextViews.
                    );

    ellQuickKeys.setOnChildClickListener(new OnChildClickListener() {    
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,int childPosition,long id) {
            Log.d("Ausgewählter Text: " + ((TextView) v.findViewById(R.id.lblChildText)).getText());

            return false;
        }
    });
    ellQuickKeys.setAdapter(expListAdapter);

child_row.xml

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X