2011-07-27 17 views
0

我想要發生以下事情(一個簡單的想法):我點擊我的主要活動中的添加按鈕,輸入一些信息(到EditText框中),並返回到主屏幕。在這裏,我想顯示一個列表,只有兩個標題(不是所有的信息)。當我點擊該列表項目時,我想顯示該項目的相應保存信息。因此,每件商品的信息會有所不同。具體OnItemClick意圖Android

當我這樣做時,我使用主屏幕上的startActivityForResult(),然後返回。這對於一個項目來說是完美的。當我添加另一個項目時,問題就出現了。無論點擊哪個項目,顯示的信息都是相同的。總之,我需要找到一種方法來保存每個項目獨有的信息。

截至目前,我有下面的代碼片段:

//After I add all the information in the second intent 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == 1) { 
     //these display in the list (Each list item has two textfields,row1 and row 2) 

     row1 = data.getStringExtra("com.painLogger.row1"); 
     row2 = data.getStringExtra("com.painLogger.row2"); 

      //below is the other info entered 

     painLevelString = data.getStringExtra("com.painLogger.painLevel"); 
     painLocation = data.getStringExtra("painLocation"); 
     timeOfPainString = data.getStringExtra("com.painLogger.painTime"); 
     textTreatmentString = data 
       .getStringExtra("com.painLogger.treatment"); 
     addItem(); 
    } 
} 

    //When I click the item-- this is the info that is not unique... 
public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
    Intent intent = new Intent(this, Item1.class); 
    intent.putExtra("com.painLogger.painLevel", painLevelString); 
    intent.putExtra("com.painLogger.painTime" , timeOfPainString); 
    intent.putExtra("com.painLogger.treatment", textTreatmentString); 
    intent.putExtra("painLocation", painLocation); 
    startActivity(intent); 
} 

// 編輯:添加項目CODE添加

private void addItem() { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("row_1", row1); 
    map.put("row_2", row2); 
    painItems.add(map); 
    adapter.notifyDataSetChanged(); 

} 

// * 編輯:一些定義*

SimpleAdapter adapter; 
List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>(); 

我可以根據堅持這是爲什麼發生 - 每次我點擊一個項目,意圖是把最後一個額外的,意味着最後一個對象的信息添加。我如何讓每個OnItemClick獨一無二?我懷疑我將不得不使用位置變量。

+0

你要保存在哪裏? –

+0

你在哪裏保存每個項目的信息? – user802421

+0

不幸的是,我認爲這是問題所在。我只保存數組列表,如我以前的問題所示(此時正在工作):http://stackoverflow.com/questions/6839965/non-functional-writing-and-getting-arrarylist-android/6840035 #6840035。那麼我將如何去保存每個項目的信息呢? – Kgrover

回答

2

兩個建議:

傳遞,而不是使用類字段中的數據,以你的方法:

addItem(String row1, String row2...){...} 

而且,你想抓住你的數據出來的圖:

public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
    Intent intent = new Intent(this, Item1.class); 
    intent.putExtra("com.painLogger.painLevel", painItems.get(position).get("row_1")); 
    intent.putExtra("com.painLogger.painTime" , painItems.get(position).get("row_2")); 
    intent.putExtra("com.painLogger.treatment", painItems.get(position).get("row_3")); 
    intent.putExtra("painLocation", painItems.get(position).get("row_4")); 
    startActivity(intent); 
} 

您當然需要在創建地圖時將「row_3」和「row_4」放入地圖中,我相信您還沒有做。

DMon在一個不同的答案的評論中建議您創建一個代表您的數據的類,他是正確的,它是更好的設計,並有助於節省這些問題。爲此,您需要查看Parcelable接口,以便能夠通過Intents傳遞您的類。你的設計將會起作用,但對於下一個人(包括你在6個月內)很難理解,並且更難以擴展。

+0

事情是,我不想在每個項目(行)中顯示其他東西。如果我將row_3和row_4放入地圖中,我需要顯示它們嗎? – Kgrover

+0

非常感謝。問題解決了。出於某種原因,您的解決方案似乎總能奏效。我無法表達我現在感覺到的浮雕:P – Kgrover

+0

mbarnes,有沒有辦法在地圖上放置圖像?我想要做同樣的事情,除了圖像,而不是字符串... – Kgrover

0

很難說沒有看到您的代碼addItem(),你如何將項目添加到列表?假設你有一個存儲值的適配器,如果是這樣,那麼在onItemClick()中,你會做painItem = adapter.getItem(position)。然後,您將使用此painItem對象組裝您的意圖。

+0

我不保存每個項目的信息。請看看:http://stackoverflow.com/questions/6839965/non-functional-writing-and-getting-arrarylist-android/6840035#6840035看我如何保存列表本身。如果你能幫我完成你所概括的事情,我將不勝感激......如果你可以給我示例代碼,那將會非常有幫助 – Kgrover

+1

現在,你可以使用'Map painItem = painItems.get(position )'並從那裏檢索你的數據,但是,使用'List >'聽起來像個壞主意。相反,嘗試創建自己的對象類並從那裏保存/加載數據。 – dmon

0

這是發生的原因是,在onItemClick發送的信息絕不基礎上被點擊了哪一行 - 它是基於在onActivityResult設置的最新值,其設定由最後項目點擊。

一個解決方案是使用ViewHolder模式的修改版本將行特定的值附加到View,然後在onItemClick中使用view.getTag檢索這些值。 ViewHolder模式的良好示例代碼可以找到here。它通常用於存儲視圖,以便它們不會不斷重新創建,但它也可以用於將值傳遞到點擊處理程序,而無需跟蹤成員變量狀態。

+0

你能否爲我的實例提供示例代碼?我不太清楚你在說什麼... – Kgrover

+0

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html涵蓋它。基本上,您將一堆數據存儲在一個對象中,使用view.setTag(Object o)方法將該對象作爲「標記」附加到行的值,然後從onClick使用getTag來檢索它。 –