java中如何在外部类方法中访问内部类变量

java中如何在外部类方法中访问内部类变量,java,android,Java,Android,我想访问spinner的外部类方法means项selected侦听器中的内部类Hashmap变量。我在内部类中声明了Hashmap,并在Hashmap内部类方法中赋值。我正在使用setOnItemSelectedListener中的键从外部类访问hashmap值,但在hashmap中得到了null值。 我在外部类中被设置为hashmap静态,并将值放在内部类中,然后再次从外部类侦听器访问,但再次得到null值。如果有人再喝一杯,请告诉我。我有点困惑,我不知道我错在哪里。请任何人都有解决办法 下面

我想访问spinner的外部类方法means项selected侦听器中的内部类Hashmap变量。我在内部类中声明了Hashmap,并在Hashmap内部类方法中赋值。我正在使用setOnItemSelectedListener中的键从外部类访问hashmap值,但在hashmap中得到了null值。
我在外部类中被设置为hashmap静态,并将值放在内部类中,然后再次从外部类侦听器访问,但再次得到null值。如果有人再喝一杯,请告诉我。我有点困惑,我不知道我错在哪里。请任何人都有解决办法

下面是外部类和内部类

public class ProjectDetailActivity extends SherlockActivity {

// declare hashmap.
HashMap<String, String> phaseIdKv = new HashMap<String, String>();
@Override
protected void onCreate(Bundle savedInstanceState) {

    new LoadPhaseData().execute(projId);
    //create variable of inner class
    final ProjectDetailActivity.LoadPhaseData inner = new ProjectDetailActivity().new LoadPhaseData(); 

   //Listener for Phase spinner

    projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener) new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            int id = projSpinnerPhase.getSelectedItemPosition();
            ++id;
            String p_id= inner.phaseIdKv.get(id); //Here I want to access inner class hashmap value
            Log.v("hashmap value","-"+inner.phaseIdKv.get(id));//getting null

            Toast.makeText(getApplicationContext(),"item-"+id+" item2"+item+"p_id"+p_id, Toast.LENGTH_LONG).show();
        }

    });     
}
private class LoadPhaseData extends AsyncTask<String, Void, Void> {


    @Override
    protected Void doInBackground(String... params) {
        -----
        JSONArray phaseData = new JSONArray(jsonpPhaseList);
            String [] phaseNo = new String[jsonpPhaseList.length()];
            String phase;
            String phaseId1;
            if (phaseData.length() >0) {
                for(int i =0;i<phaseData.length();i++){
                    JSONObject joPhasefromJa = phaseData.getJSONObject(i);

                    phase = joPhasefromJa.getString("phase_no")
                    phaseId1 = joPhasefromJa.getString("phase_id");

                    phaseIdKv.put(phase,phaseId1);                  
                }
            }
        return null;
    }
公共类ProjectDetailActivity扩展了SherlockActivity{
//声明hashmap。
HashMap phaseIdKv=新HashMap();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
新建LoadPhaseData().execute(projId);
//创建内部类的变量
final ProjectDetailActivity.LoadPhaseData内部=新建ProjectDetailActivity()。新建LoadPhaseData();
//相位微调器侦听器
projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener)新建OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
int id=projSpinnerPhase.getSelectedItemPosition();
++身份证;
字符串p_id=inner.phaseIdKv.get(id);//这里我想访问内部类hashmap值
Log.v(“hashmap值”,“-”+inner.phaseIdKv.get(id));//获取null
Toast.makeText(getApplicationContext(),“item-”+id+“item2”+item+“p_id”+p_id,Toast.LENGTH_LONG).show();
}
});     
}
私有类LoadPhaseData扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…参数){
-----
JSONArray phaseData=新JSONArray(jsonpPhaseList);
String[]phaseNo=新字符串[jsonpPhaseList.length()];
串相;
弦相1;
如果(phaseData.length()>0){

对于(int i=0;i声明要在外部作用域中访问的变量

public class ProjectDetailActivity extends SherlockActivity {
 String p_id;

 ...


    projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener) new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            int id = projSpinnerPhase.getSelectedItemPosition();
            ++id;
            p_id= inner.phaseIdKv.get(id); //Here I want to access inner class hashmap value
            Log.v("hashmap value","-"+inner.phaseIdKv.get(id));//getting null

            Toast.makeText(getApplicationContext(),"item-"+id+" item2"+item+"p_id"+p_id, Toast.LENGTH_LONG).show();
        }

    });   

 ....

}
公共类ProjectDetailActivity扩展了SherlockActivity{
字符串p_id;
...
projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener)新建OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
int id=projSpinnerPhase.getSelectedItemPosition();
++身份证;
p_id=inner.phaseIdKv.get(id);//这里我想访问内部类hashmap值
Log.v(“hashmap值”,“-”+inner.phaseIdKv.get(id));//获取null
Toast.makeText(getApplicationContext(),“item-”+id+“item2”+item+“p_id”+p_id,Toast.LENGTH_LONG).show();
}
});   
....
}

问题是phaseNo[index]未初始化。它为空。您的密钥为空


如果要访问类中任何地方的p_id,请将其声明为outerclass变量。

请参阅链接我不明白您说了什么?您有innerclass scope变量和outerclass scope变量。在outerclass范围中声明的变量对内部类可见。既然要访问外部类中的p_id,请声明它在外部类中,PhaseNo在这里不是null,因为我确实使用类似log.v(“PhaseNo[i],“-”+phase)的日志检查了这个值,它的打印很好,而且我的hashmap也正确地填充了数据键值对。所有内容都正确地放在了内部类中,但我无法在外部类中访问。请参阅更新question@nileshwani在编辑PhaseNo[i]之前是初始化的。它是空的。在你的例子中Hashmap接受字符串的键值对。所以当你得到值时,使用字符串作为键。保留旧的帖子,这样它就不会误导访问帖子的人。你做了这个phaseIdKv.put(phaseNo[i],phaseId1);这个phaseNo[i]不是初始化的Hanks,当我在代码中编写String.valueOf(id)时它工作得很好。但是我不明白为什么这项工作现在可以解释一下。您的键是一个字符串,正如我在上面的评论中提到的。您使用的id是int。所以您需要将int转换为String,然后使用键获取值。HashMap phaseIdKv=new HashMap();字符串的哈希映射键值对表示key is string value is string。如果有帮助,请接受并投票回答
     HashMap<String, String> phaseIdKv = new HashMap<String, String>();
      //phaseNo is a string array.
      for(int i =0;i<phaseData.length();i++){ 
       phase = joPhasefromJa.getString("phase_no")
       phaseId1 = joPhasefromJa.getString("phase_id");
       phaseIdKv.put(phase ,phaseId1);  
      }
     int id = projSpinnerPhase.getSelectedItemPosition();
     ++id;
     String p_id= phaseIdKv.get(String.valueOf(id));// convert int to string
     id should match phase that is the key put in hash map