Android 我们可以在另一个类中访问一个类的Java.util映射吗

Android 我们可以在另一个类中访问一个类的Java.util映射吗,android,Android,我正在扩展SimpleCorsAdapter的calss中使用SortedMap。我可以从扩展ListActivity的另一个类访问该映射吗 下面给出了我使用的代码 public class ListContacts extends ListActivity { ListAdapter lAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanc

我正在扩展SimpleCorsAdapter的calss中使用SortedMap。我可以从扩展ListActivity的另一个类访问该映射吗

下面给出了我使用的代码

public

class ListContacts extends ListActivity { 
ListAdapter 

lAdapter; 
@Override


public void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 
setContentView(R.layout.

activitylist); 

// 

/** 
* 

* Use the ContentResolver instance to query the database and return a

* Cursor with the contacts list. The query is performed against the URI

* stored in ContactsContract.Contacts.CONTENT_URI.

*/


Cursor cursor = getContentResolver().query(

ContactsContract.Contacts.

CONTENT_URI, null, 
ContactsContract.Contacts.

HAS_PHONE_NUMBER + " = 1", null,null); 
startManagingCursor(cursor);



// start mappings 

String[]  columns = new String[] { ContactsContract.Contacts.DISPLAY_NAME }; 

int[] names  = new int[] { R.id.contact_name }; 


lAdapter = new ImageCursorAdapter(this, R.layout.main, cursor, columns,names); 



@Override 

protected void onListItemClick(ListView l, View v, int position, long id) { 

super.onListItemClick(l, v, position, id); 
}





} //  end of class ListContacts 



public

class ImageCursorAdapter extends SimpleCursorAdapter { 


private Cursor c; 

private Context context; 

SortedMap<String, String> 

phoneNumberMap = new TreeMap<String, String>(); 


public SortedMap<String, String> getPhoneNumberMap() { 

return phoneNumberMap; 
}



public void setPhoneNumberMap(SortedMap<String, String> phoneNumberMap) { 

this.phoneNumberMap = phoneNumberMap; 
}








public ImageCursorAdapter(Context context, int layout, Cursor c, 
String[] from, 

int[] to) { 

super(context, layout, c, from, to); 


this.c = c; 

this.context = context; 
}







public View getView(int pos, View inView, ViewGroup parent) { 
phoneNumberMap

.put("1", "fasfa"); 
  phoneNumberMap.put("2", "fasfa1"); 

phoneNumberMap.put("3", "fasfa2"); 

phoneNumberMap.put("4", "fasfa3"); 

phoneNumberMap.put("5", "fasfa4");

phoneNumberMap.put("6", "fasfa5");

System.

out.println(" Map : size: " + phoneNumberMap.size()); 

} 
}// end of  class ImageCursorAdapter
公共
类ListContacts扩展ListActivity{
列表适配器
激光雷达;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局)。
活动列表);
// 
/** 
* 
*使用ContentResolver实例查询数据库并返回
*带有联系人列表的游标。根据URI执行查询
*存储在Contacts contract.Contacts.CONTENT\u URI中。
*/
Cursor Cursor=getContentResolver().query(
联系人contract.Contacts。
内容URI,null,
联系人contract.Contacts。
有电话号码+“=1”,空,空);
开始管理游标(游标);
//开始映射
String[]columns=新字符串[]{ContactsContract.Contacts.DISPLAY_NAME};
int[]name=新int[]{R.id.contact_name};
lAdapter=新的ImageCursorAdapter(this,R.layout.main,cursor,columns,names);
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
super.onListItemClick(左、右、位置、id);
}
}//类结束ListContacts
公众的
类ImageCursorAdapter扩展了SimpleCursorAdapter{
专用游标c;
私人语境;
分类地图
phoneNumberMap=新树映射();
public SortedMap getPhoneNumberMap(){
返回电话号码映射;
}
公共无效setPhoneNumberMap(SortedMap phoneNumberMap){
this.phoneNumberMap=phoneNumberMap;
}
公共图像游标适配器(上下文上下文、int布局、游标c、,
字符串[]来自,
int[]到){
super(上下文、布局、c、from、to);
这个.c=c;
this.context=上下文;
}
公共视图获取视图(int pos、View inView、ViewGroup parent){
电话号码映射
.put(“1”,“fasfa”);
电话号码映射put(“2”,“fasfa1”);
电话号码映射放置(“3”,“fasfa2”);
电话号码映射放置(“4”,“fasfa3”);
电话号码map.put(“5”,“fasfa4”);
电话号码map.put(“6”,“fasfa5”);
系统。
println(“Map:size:+phoneNumberMap.size());
} 
}//类末ImageCursorAdapter

如何在Listcontacts类的onListItemClick()方法中访问phoneNumberMap。

我记得SortedMap是可变的,您可以这样做

SortedMap<String, String> leakingSortedMap = lAdapter.getPhoneNumberMap();
SortedMap leakingSortedMap=lAdapter.getPhoneNumberMap();
如果不更改映射的值,我建议修改getPhoneNumberMap,如

public SortedMap<String, String> getPhoneNumberMap() { 

return Collections.unmodifiableMap(phoneNumberMap); 
}
public SortedMap getPhoneNumberMap(){
返回集合。不可修改映射(phoneNumberMap);
}

这里解释-

您遇到的更普遍的问题是如何跨多个活动和应用程序的所有部分保存状态。静态变量是实现这一点的常用Java方法

private class ImageCursorAdapter extends SimpleCursorAdapter 
 {   
 ***private static SortedMap<String, String> phoneNumberMap = new TreeMap<String, String> ();***

 public static SortedMap<String, String> getPhoneNumberMap() {
    return phoneNumberMap;
}

  public static void setPhoneNumberMap(SortedMap<String, String> phoneNumberMap) {
    ImageCursorAdapter.phoneNumberMap = phoneNumberMap;
}
}

}

参考:

方法是创建自己的android.app.Application子类,然后在清单中的应用程序标记中指定该类。现在,Android将自动创建该类的实例,并使其可用于您的整个应用程序。您可以使用context.getApplicationContext()方法从任何上下文访问它(Activity还提供了一个方法getApplication(),该方法具有完全相同的效果):


这与使用静态变量或单例的效果基本相同,但与现有的Android框架集成得相当好。请注意,这不会跨进程运行(如果您的应用程序是少数几个具有多个进程的应用程序之一)。

您需要对ImageCursorAdapter对象的引用。然后你可以调用getPhoneNumberMap方法。你能解释得更清楚一点吗?首先,我建议你阅读关于不变性/易变性的内容。其次,您必须理解内存泄漏的含义。第三,你确定lAdapter的位置就在这个确切的活动中吗?你可以将它提取到另一个类中,使其可观察(或单例)?通过这样做,你打破了封装!我建议你扔掉极限编程,先读一些书。
 public class class ListContacts extends ListActivity {

 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

 System.out.println("Map size: : " + ImageCursorAdapter.getPhoneNumberMap().size());

Set s = ImageCursorAdapter.getPhoneNumberMap().entrySet();

Iterator it = s.iterator();

while (it.hasNext()) {
    Map.Entry m = (Map.Entry) it.next();

    String key = (String) m.getKey();

    String value = (String) m.getValue();

    System.out.println("loadContactDetails  Map : Value : Names : " + value);
    System.out.println("loadContactDetails  Map : Key : Names : " + key);
}
      class MyApp extends Application {   
      private String myState;   
      public String getState(){ 
         return myState;  
        }  
     public void setState(String s){    
       myState = s;  
       } 
      }  

     class Blah extends Activity {  

    @Override   

   public void onCreate(Bundle b){   

       ...     MyApp appState = ((MyApp)getApplicationContext()); 

          String state = appState.getState();   

            ...   } }