簡體   English   中英

特定的OnItemClick Intent Android

[英]Specific OnItemClick Intent Android

我希望發生以下情況(一個簡單的想法):我在主活動中單擊一個添加按鈕,輸入一些信息(進入EditText框),然后返回主屏幕。 在這里,我想顯示一個列表,只有兩個標題(不是所有信息)。 當我單擊該列表項目時,我想顯示該項目的相應保存信息。 因此,每個項目的信息將會有所不同。

當我這樣做時,我從主屏幕然后回來使用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);
}

// 編輯:添加添加的項目代碼

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都是唯一的? 我懷疑我將不得不使用位置變量。

兩條建議:

將數據傳遞給您的方法而不是使用類字段:

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個月內)很難理解並且更難以擴展。

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

發生這種情況的原因是onItemClick 發送的信息絕不是基於單擊哪一行 - 它基於onActivityResult中設置的最新值,這些值是由最后一個項目設置的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM