【问题标题】:How to get onChildClick value from expandablelistview in android?如何从android中的expandablelistview获取onChildClick值?
【发布时间】:2011-10-20 06:28:34
【问题描述】:

我正在开发一个项目,将 JSON 从 url 解析为 ExpandableListView。根据“状态”标签值(活动或待定),将相应地放置记录到不同的组“活动”和“待定”。一切正常。

我的问题是当我点击第二组中的一个孩子时,它应该显示不同的数据,但我从第一组孩子那里获取数据。

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;

       }






 }

public boolean onChildClick() 调用时的LogCat信息:

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(Active) 和 group2(Pending) 上得到相同的值

我需要基于点击的每个子视图的特定值。

【问题讨论】:

    标签: android


    【解决方案1】:

    您必须使用 Adapter 的 getChild(groupPosition, childPosition) 方法来检索 child 的实例并将其强制转换为您的 Map 并使其正常工作。

    @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);
    }
    

    【讨论】:

    • 不需要访问全局适配器实例。而是使用提供的方法来获取名为 getExpandableListAdapter() 的适配器。
    【解决方案2】:

    试试这个:

    @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;
    }
    

    【讨论】:

    • 谢谢。我在我的应用程序中做了
    • @NagkeeranPiraba:当我点击子项时,这个方法不会被调用,你能解释一下吗?
    【解决方案3】:

    以下内容并不完美,但确实有效。对于那些需要访问视图而不覆盖 onChildClick 方法(例如带有 ExpandableListView 的自定义对话框)的人来说,这可能会有所帮助。

        ExpandableListView ellQuickKeys = (ExpandableListView) layout.findViewById(R.id.ellQuickKeys);
    
        SimpleExpandableListAdapter expListAdapter =
                new SimpleExpandableListAdapter(
                                this,
                                createGroupList(),                              // Creating group List.
                                R.layout.group_row,                             // Group item layout XML.                       
                                new String[] { "Group Item" },  // the key of group item.
                                new int[] { R.id.row_name },    // ID of each group item.-Data under the key goes into this TextView.                                   
                                createChildList(),                              // childData describes second-level entries.
                                R.layout.child_row,                             // Layout for sub-level entries(second level).
                                new String[] {"Sub Item"},              // Keys in childData maps to display.
                                new int[] { R.id.lblChildText}             // Data under the keys above go into these TextViews.
                        );
    
        ellQuickKeys.setOnChildClickListener(new OnChildClickListener() {    
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,int childPosition,long id) {
                Log.d("Selected text: " + ((TextView) v.findViewById(R.id.lblChildText)).getText());
    
                return false;
            }
        });
        ellQuickKeys.setAdapter(expListAdapter);
    

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多