2011-10-20 4 views
3

私は、JSONをURLからExpandableListViewに解析するプロジェクトに取り組んでいます。 「ステータス」タグ値(アクティブまたは保留中)に応じて、異なるグループ「アクティブ」および「ペンディング」に応じてレコードを配置します。すべてがうまくいきます。androidのexpandablelistviewからonChildClickの値を取得する方法は?

私の問題は、別のデータを表示するはずの2番目のグループ内の子供をクリックしたときですが、最初のグループの子からデータを取得しています。

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; 
import android.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<Map<String, String>> child1; 
    List<Map<String, String>> child2; 

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



    List<Map<String, String>> groups = new ArrayList<Map<String, String>>(); 
    Map<String, String> group1 = new HashMap<String, String>(); 
    group1.put("group", " Active"); 
    groups.add(group1); 
    Map<String, String> group2 = new HashMap<String, String>(); 
    group2.put("group", " Pending"); 
    groups.add(group2); 
    child1 = new ArrayList<Map<String, String>>(); 
    child2 = new ArrayList<Map<String, String>>(); 




    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<jArray.length() ;i++){      


    Map<String, String> childdata1 = new HashMap<String, String>(); 

     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<String, String> childdata2= new HashMap<String, String>(); 
       childdata2.put("0", String.valueOf(i+1)+" "+ e.getString("mlsid")); 


       child2.add(childdata2); 




     } 


    } 

    }catch(JSONException e)  { 
Log.e("log_tag", "Error parsing data "+e.toString()); 
    } 





     List<List<Map<String, String>>> childs = new ArrayList<List<Map<String, String>>>(); 
     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); 
} 


**//Here I am Getting problem** 

@SuppressWarnings("unchecked") 
public boolean onChildClick(
      ExpandableListView parent, 
      View v, 
      int groupPosition, 
      int childPosition, 
      long id) { 
Log.d("LOG_TAG", "onChildClick: "+"GROUP: "+groupPosition+" CHILD Position: "+ childPosition); 

HashMap<String, String> o = (HashMap<String, String>) parent.getItemAtPosition(childPosition+1);   

       String val = o.get("0"); 
      Log.d("LOG_TAG", "selected value : "+val ); 




      return false; 

     } 






} 

LogCat情報公共ブールonChildClickは()と呼ばれる:

10-20 11:24:28.004: DEBUG/LOG_TAG(1652): onChildClick: GROUP: 0 CHILD Position: 0 
10-20 11:24:28.004: DEBUG/LOG_TAG(1652): selected value : 1 555 
10-20 11:24:42.454: DEBUG/LOG_TAG(1652): onChildClick: GROUP: 1 CHILD Position: 0 
10-20 11:24:42.454: DEBUG/LOG_TAG(1652): selected value : 1 555 

Logcatは私が特定の値を必要とする(アクティブ)group1とgroup2の(保留)

に同じ値を取得していますことを示していますクリックに基づいて子ビューごとに表示されます。

答えて

13

アダプターの​​メソッドを使用して、子のインスタンスを取得し、それをマップにキャストし、動作させる必要があります。

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

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

どうもありがとう、その作業、 – mH16

+3

グローバルアダプタインスタンスにアクセスする必要はありません。代わりに、getExpandableListAdapter()というアダプターを取得するために、提供されているメソッドを使用してください。 – slott

3

このお試しください:以下

@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 + ": Child " + childPos + " clicked in group "+ groupPos, Toast.LENGTH_SHORT).show(); 
     return true; 
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { 
     int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
     Toast.makeText(this, title + ": Group " + groupPos + " clicked",Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

    return false; 
} 
+0

素敵な一人... –

+0

ありがとうございました。私のアプリケーションでしました – Piraba

+0

@NagkeeranPiraba:子アイテムをクリックするとこのメソッドは呼び出されません。 – mH16

2

は完璧ではないですが、それは動作します。 ExpandableListViewを使用したカスタムダイアログなど、onChildClickメソッドをオーバーライドしないでビューにアクセスする必要があるユーザーにとっては役立ちます。

​​

child_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 

<TextView android:id="@+id/lblChildText" 
    android:paddingLeft="50dp" 
    android:focusable="false" 
    android:textSize="18dp" 
    android:textStyle="normal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

</LinearLayout> 
関連する問題