如何从另一个函数获取java中的hashmap键和值

如何从另一个函数获取java中的hashmap键和值,java,android,json,hashmap,Java,Android,Json,Hashmap,我有一个类似这样的json解析 public class SecondFragment extends Fragment implements OnClickListener { // URL to get contacts JSON private static String contestUrl = "http://api.apps.com/contest"; // JSON Node names private static final String TAG_ITEM_ID = "i

我有一个类似这样的json解析

public class SecondFragment extends Fragment implements OnClickListener {


// URL to get contacts JSON
private static String contestUrl = "http://api.apps.com/contest";

// JSON Node names
private static final String TAG_ITEM_ID = "id";    
private static final String TAG_URL = "url";    
private static final String TAG_START_DATE = "start_date";    
private static final String TAG_END_DATE = "end_date";   

// contacts JSONArray
JSONArray foods = null;

// Hashmap for ListView
ArrayList<HashMap<String, String>> foodslist;



}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    foodslist = new ArrayList<HashMap<String, String>>();




 // Calling async task to get json
    new GetContacts().execute();

}

/**
 * Async task class to get json by making HTTP call
 * */
private class GetContacts extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(contestUrl, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {

                foods = new JSONArray(jsonStr);

                // looping through All Contacts
                for (int i = 0; i < foods.length(); i++) {
                    JSONObject c = foods.getJSONObject(i);

                    String id = c.getString(TAG_ITEM_ID);
                    String name = c.getString(TAG_URL);
                    String email = c.getString(TAG_START_DATE);
                    String address = c.getString(TAG_END_DATE);

                    // tmp hashmap for single contact
                    HashMap<String, String> contact = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    contact.put(TAG_ITEM_ID, id);
                    contact.put(TAG_URL, name);
                    contact.put(TAG_START_DATE, email);
                    contact.put(TAG_END_DATE, address);

                    String start_date = (String)contact.get(TAG_ITEM_ID);

                    // adding contact to contact list
                    foodslist.add(contact);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;
    }
}
public类SecondFragment扩展了片段实现OnClickListener{
//获取联系人JSON的URL
专用静态字符串URL=”http://api.apps.com/contest";
//JSON节点名称
私有静态最终字符串标记\u ITEM\u ID=“ID”;
私有静态最终字符串标记_URL=“URL”;
私有静态最终字符串标记\u START\u DATE=“START\u DATE”;
私有静态最终字符串标记\u END\u DATE=“END\u DATE”;
//联系JSONArray
JSONArray食品=空;
//ListView的Hashmap
ArrayList Foodlist;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onActivityCreated(savedInstanceState);
FoodList=新的ArrayList();
//调用异步任务以获取json
新建GetContacts().execute();
}
/**
*异步任务类通过HTTP调用获取json
* */
私有类GetContacts扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…arg0){
//创建服务处理程序类实例
ServiceHandler sh=新的ServiceHandler();
//向url发出请求并获得响应
字符串jsonStr=sh.makeServiceCall(contestUrl,ServiceHandler.GET);
Log.d(“响应:”、“>”+jsonStr);
if(jsonStr!=null){
试一试{
食品=新JSONArray(jsonStr);
//通过所有触点循环
对于(int i=0;ivalue
联系人。放置(标签项目ID,ID);
contact.put(TAG_URL,name);
联系人。放置(标记开始日期、电子邮件);
联系方式(标签、结束日期、地址);
字符串start\u date=(字符串)contact.get(TAG\u ITEM\u ID);
//将联系人添加到联系人列表
添加(联系人);
}
}捕获(JSONException e){
e、 printStackTrace();
}
}否则{
Log.e(“ServiceHandler”,“无法从url获取任何数据”);
}
返回null;
}
}
}

我有两个功能,
onCreate
GetContacts
。在
onCreate
的末尾,它调用
GetContacts
并调用这个json

我的问题是,如何获得
GetContacts
上的
Hashmap
值,以便在
onCreate上使用它

到目前为止,我得到这个值是为了得到
Hashmap

String start\u date=(String)contact.get(TAG\u ITEM\u ID)

但是,它只在
GetContacts
上起作用。 有人能帮我吗

谢谢你的光临

List<Map<String,String>> foodslist = ...;
你可以打电话

String id = xxx.getAttr( i, TAG_ITEM_ID );
所以返回数据

public List<Map<String, String>> getContacts() {
if (foodslist != null && foodslist.isEmpty()) {
    return foodslist;
}
foodslist = new ArrayList<Map<String, String>>();
try {

foods = new JSONArray(jsonStr);

// looping through All Contacts
for (int i = 0; i < foods.length(); i++) {
   JSONObject c = foods.getJSONObject(i);

   String id = c.getString(TAG_ITEM_ID);
   String name = c.getString(TAG_URL);
   String email = c.getString(TAG_START_DATE);
   String address = c.getString(TAG_END_DATE);

   // tmp hashmap for single contact
   HashMap<String, String> contact = new HashMap<String, String>();

   // adding each child node to HashMap key => value
   contact.put(TAG_ITEM_ID, id);
   contact.put(TAG_URL, name);
   contact.put(TAG_START_DATE, email);
   contact.put(TAG_END_DATE, address);

   // adding contact to contact list
   foodslist.add(contact);
}
return foodslist;
}
public List getContacts(){
if(foodList!=null&&foodList.isEmpty()){
返回食物列表;
}
FoodList=新的ArrayList();
试一试{
食品=新JSONArray(jsonStr);
//通过所有触点循环
对于(int i=0;ivalue
联系人。放置(标签项目ID,ID);
contact.put(TAG_URL,name);
联系人。放置(标记开始日期、电子邮件);
联系方式(标签、结束日期、地址);
//将联系人添加到联系人列表
添加(联系人);
}
返回食物列表;
}

虽然我不知道为什么这个变量被称为foodList,如果它应该包含联系人。

有两种方法:

Way-1: 创建HashMap联系人的实例变量(类级别),然后可以在类中的任何位置使用它,包括onCreate和getContacts方法

package stackoverflow.q_25034927;

import java.util.HashMap;
import java.util.Map;

public class PassVariable {
    private static Map<String, String> contact = new HashMap<String, String>();

    public void onCreate() {
        //populate contact object as per your logic
        getContacts();
    }

    private void getContacts() {
        //Use contact object directly which was pre-populby onCreate method.
    }
}

要回答下面的#3,变量s在NotInner类中不可访问:

package com.test;

public class Test {
    static String s = "";
}

class NotInner {
    public static void main(String[] args) {
        System.out.println(s); //Compilation error: s cannot be resolved to a variable
    }
}

不确定,这里到底是什么问题。您正在将hashmap
contact
添加到
FoodList
中。什么类型是
FoodList
?如果您从类中的多个方法访问它,为什么不能返回它或使它成为类成员?请发布完整的代码或至少是带有简要描述的方法API,以提供更多信息清晰性。你能检查我的问题吗?我编辑了我的代码。但是如果我从你的答案中看到,我错过了
onCreate
中的for循环吗?我说得对吗?“}”onActivityCreated(Bundle)方法之前的括号会生成编译时错误。|2.FoodList作为实例变量是完全正确的3.GetContacts类应该作为内部类在SecondFragment类中。对不起,您能解释更多关于第三点的信息吗?我真的不明白,请检查我编辑的答案,您需要内部类来访问GetContacts中的'FoodList'变量。
package stackoverflow.q_25034927;

import java.util.HashMap;
import java.util.Map;

public class PassVariable {
    private static Map<String, String> contact = new HashMap<String, String>();

    public void onCreate() {
        //populate contact object as per your logic
        getContacts();
    }

    private void getContacts() {
        //Use contact object directly which was pre-populby onCreate method.
    }
}
package stackoverflow.q_25034927;

import java.util.HashMap;
import java.util.Map;

public class PassVariable {

    public void onCreate() {
        final Map<String, String> contact = new HashMap<String, String>();
        //populate contact object as per your logic.
        getContacts(contact);
    }

    private void getContacts(Map<String, String> contact) {
        //Use contact object which is passed as argument.
    }
}
String email = c.getString(TAG_START_DATE);
String address = c.getString(TAG_END_DATE);
package com.test;

public class Test {
    static String s = "";
}

class NotInner {
    public static void main(String[] args) {
        System.out.println(s); //Compilation error: s cannot be resolved to a variable
    }
}