2011-01-04 11 views
0

SimpleCursoradapterを継承するカルスでSortedMapを使用しています。 ListActivityを拡張する別のクラスからそのマップにアクセスできますか?別のクラスのクラスのJava.utilマップにアクセスできますか?

使用するコードは以下のとおりです。

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クラスのonListItemClick()メソッドでphoneNumberMapにアクセスするにはどうすればよいですか。

+0

ImageCursorAdapterのオブジェクトへの参照が必要です。次に、getPhoneNumberMapメソッドを呼び出すことができます。 – RoflcoptrException

+0

あなたはもう少し詳しく説明することができます – jennifer

答えて

1

これを行う方法はandroid.app.Applicationの独自のサブクラスを作成することです、そのクラスをアプリケーションタグiで指定しますnあなたのマニフェスト。 Androidは自動的にそのクラスのインスタンスを作成し、アプリケーション全体で使用できるようにします。あなたは、(全く同じ効果を有する活性はまた、方法getApplicationを(提供))Context.getApplicationContext()メソッドを使用して、任意のコンテキストからアクセスすることができる:

 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(); 

      ... } } 

これは本質的に静的変数を使用するのと同じ効果を有します既存のAndroidフレームワークに非常によく統合されています。これはプロセス間では機能しません(アプリケーションが複数のプロセスを持つまれなアプリケーションの1つである必要があります)。

0

は、私はSortedMapのは可変であり、あなたがマップの値を変更しない場合は、この

SortedMap<String, String> leakingSortedMap = lAdapter.getPhoneNumberMap(); 

を行うことができ思い出すと、私は

public SortedMap<String, String> getPhoneNumberMap() { 

return Collections.unmodifiableMap(phoneNumberMap); 
} 
ここ

それが説明されているようgetPhoneNumberMapを変更することをお勧め - http://download.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#unmodifiableMap(java.util.Map

+0

最初に、私はあなたに不変性/不成功性について読むことをお勧めします。 第2に、メモリリークの意味を理解する必要があります。 第3に、あなたはlAdapterの場所がこの正確なアクティビティにあることを確信していますか?それを別のクラスに抽出してObservable(またはSingleton)にすることはできますか? – fiction

+0

これを行うと、カプセル化が中断されます。極端なプログラミングを捨て、最初にいくつかの本を読むことをお勧めします。 – fiction

0

より一般的な問題は、いくつかのアクティビティとアプリケーションのすべての部分に状態を保存する方法です。静的変数は、これを達成するための一般的な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; 
} 

}

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

}

}

はREFER: How to declare global variables in Android?

関連する問題