如何在android中从expandablelistview获取onChildClick值?
我正在进行一个项目,将JSON从url解析为ExpandableListView。根据“状态”标记值(活动或挂起),将根据不同的组“活动”和“挂起”放置记录。一切正常 我的问题是,当我点击第二组中的一个子项时,它应该显示不同的数据,但我从第一组子项中获取数据如何在android中从expandablelistview获取onChildClick值?,android,Android,我正在进行一个项目,将JSON从url解析为ExpandableListView。根据“状态”标记值(活动或挂起),将根据不同的组“活动”和“挂起”放置记录。一切正常 我的问题是,当我点击第二组中的一个子项时,它应该显示不同的数据,但我从第一组子项中获取数据 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.JSONA
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显示我得到的group1(活动)和group2(挂起)的值相同
我需要基于单击的每个子视图的特定值。您必须使用适配器的
getChild(groupPosition,childPosition)
方法来检索child实例,并将其强制转换到地图中并使其工作
@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);
}
@覆盖
公共布尔onChildClick(ExpandableListView父视图,视图v,
int groupPosition、int childPosition、long id){
Toast.makeText(此,(字符串)((映射)
adapter.getChild(groupPosition,childPosition)).get(“lalit”),
Toast.LENGTH_LONG).show();
返回super.onChildClick(parent,v,groupPosition,childPosition,id);
}
试试这个:
@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;
}
下面的示例并不完美,但它很有效。对于那些需要访问视图而不重写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>
谢谢。我在我的application@NagkeeranPiraba:当我单击子项时未调用此方法,您能再解释一下吗?无需访问全局适配器实例。而是使用提供的方法获取名为getExpandableListAdapter()的适配器。
<?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>