繁体   English   中英

如何从另一个函数中获取Java中的哈希映射键和值

[英]How to get hashmap key and value in java from another function

我有一个像这样的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;
    }
}

}

我有两个函数, onCreateGetContacts onCreate的最后,调用GetContacts并调用此json。

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

到目前为止,我已经获得了Hashmap的价值

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

但是,它仅适用于GetContacts 有人可以帮助我吗?

谢谢之前

你有

List<Map<String,String>> foodslist = ...;

它填充在循环中。

要获得单个值,请迭代:

for( Map<String,String> item: foodslist ){
   String id = item.get(TAG_ITEM_ID);
   String name = item.get(TAG_URL);
   String email = item.get(TAG_START_DATE);
   String address = item.get(TAG_END_DATE);
}

或者您为保留食物清单的类写一个方法:

String getAttr( int i, String tag ){
    return foodslist.get(i).get(tag);
} 

你可以打电话

String id = xxx.getAttr( i, TAG_ITEM_ID );

有几种方法:

方式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.
    }
}

方式2:将地图传递到getContacts()方法:

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.
    }
}

另一方面,在命名Java方法或变量时,请使用cameCasing。 GetContacts不正确,将其设为getContacts。

对于电子邮件和地址字段,使用TAG_START_DATE和TAG_END_DATE不好玩。 :-)

String email = c.getString(TAG_START_DATE);
String address = c.getString(TAG_END_DATE);

为了回答下面的#3,在NotInner类中无法访问变量s:

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

所以返回数据...

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

尽管我不确定该变量是否包含联系人,为什么将其称为foodslist。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM