2013-04-24 25 views
0

我對Android編程相當陌生,已經完成了我的第一個應用程序,除了一個從選定表格行(onClick)傳遞數據的問題外。我在這裏進行了研究並嘗試了大部分建議,但我顯然錯過了一些關鍵的東西。我對getTag/Id和setTag/Id有點困惑,所以也許這就是我出錯的地方。無法將正確的表格行數據傳遞到下一個活動

有一點背景,表中可以有1到N的行數從數據庫動態填充,每行都是可點擊的。一旦單擊一行,我需要將該行的唯一數據傳遞給下一個活動(使用Bundle可以正常工作)。不起作用的是,不管我點擊哪一行,我只獲取傳遞給下一個活動的最後一行數據,而不是所點擊行的數據。

這是我的一些相關的代碼添加到行/表和onclick數據......我做錯了只得到最後一行的數據?真心感謝任何人的幫助,指引我朝着正確的方向前進。

public void addData(ArrayList<Auctions> auctions) { 

     prevCity = ""; 
     currCity = ""; 
     prevDate = ""; 
     currDate = ""; 
     prevTime = ""; 
     currTime = ""; 
     prevUnit = ""; 
     currUnit = ""; 

     for (Iterator i = auctions.iterator(); i.hasNext();) { 
      Auctions p = (Auctions) i.next(); 

      if (p.getCity().equals(prevCity) && p.getDate().equals(prevDate) && p.getTime().equals(prevTime) && p.getSunit().equals(prevUnit)) { 
       //skip to next unique record 
      } else { 

       /** Create a City TableRow dynamically **/ 
       row2 = new TableRow(this); 
       row2.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 

       /** Creating a TextView to add to the row **/ 
       tvcity = new TextView(this); 
       currCity = p.getCity(); 
       if (currCity.toString().equals(prevCity)) { 
        tvcity.setText(""); 
       } else { 
        //create a blank row to separate from previous city entries 
        row1 = new TableRow(this); 
        row1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 
        tvdummy = new TextView(this); 
        tvdummy.setText(""); 
        tvdummy.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 
        row1.addView(tvdummy); 
        auctions_table.addView(row1, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

        // work on the new city data 
        tvcity.setText(p.getCity()); 
       } 

       tvcity.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 
       tvcity.setTextColor(getResources().getColor(R.color.red)); 

       //add TextView data to row 
       row2.addView(tvcity); 

       // Add the TableRow to the TableLayout 
       auctions_table.addView(row2, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

       // Create date, time, and unit name row dynamically 
       row3 = new TableRow(this); 
       row3.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 

       // Create TextViews to add to the Row -- Date and Time 
       tvdate = new TextView(this); 
       tvtime = new TextView(this); 
       tvsunit = new TextView(this); 

       currDate = p.getDate(); 
       currTime = p.getTime(); 
       currUnit = p.getSunit(); 

       if ((currDate.toString().equals(prevDate)) && (currTime.toString().equals(prevTime))) { 
        tvdate.setText(""); 
        tvtime.setText(""); 
       } else { 
        tvdate.setText(p.getDate()); 
        tvtime.setText(p.getTime()); 
       } 

       if (currUnit.toString().equals(prevUnit)) { 
        tvsunit.setText(""); 
       } else { 
        tvsunit.setText("Dynamic UNIT"); 
        tvsunit.setText(p.getSunit()); 
       } 

       tvdate.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
       tvdate.setTextColor(getResources().getColor(R.color.blue)); 

       tvtime.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
       tvtime.setTextColor(getResources().getColor(R.color.blue)); 

       tvsunit.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
       tvsunit.setTextColor(getResources().getColor(R.color.blue));     

       //add TextView data to row 
       row3.addView(tvdate); 
       row3.addView(tvtime); 
       row3.addView(tvsunit); 

       row3.setId(t); 
       row3.setFocusable(false); 
       //row3.setClickable(true); 
       row3.setOnClickListener(new View.OnClickListener() {  
        //public OnClickListener tablerowOnClickListener = new OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // Get the selected row's data 
          //row3.getId(); 
          Bundle basket2 = new Bundle(); 
          basket2.putString("ustate", state.getText().toString()); 
          basket2.putString("abbrev", abbrev); 
          basket2.putString("ucity", currCity); 
          basket2.putString("uname", currUnit); 
          basket2.putString("auctiondate", currDate); 
          basket2.putString("auctiontime", currTime); 

          Intent StAuctions = new Intent(getApplicationContext(), StorageAuctionDetails.class); 
          StAuctions.putExtras(basket2); 
          StAuctions.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(StAuctions); 
          // Closing screen 
          //finish(); 
         } 
        }); 
       row3.setBackgroundResource(drawable.list_selector_background); 

       // Add the TableRow to the TableLayout 
       auctions_table.addView(row3, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));     
      } 

      prevCity = currCity; 
      prevDate = currDate; 
      prevTime = currTime; 
      prevUnit = currUnit; 
      t++; 
     } 
    }; 

回答

0

你會得到基於它們是什麼時候的onClick被激活這些變量:

basket2.putString("ustate", state.getText().toString()); 
          basket2.putString("abbrev", abbrev); 
          basket2.putString("ucity", currCity); 
          basket2.putString("uname", currUnit); 
          basket2.putString("auctiondate", currDate); 
          basket2.putString("auctiontime", currTime); 

這些價值將是不管你通過你的迭代跑了最後一次。

您需要爲每個行條目創建一個新的「籃子」。不要在點擊監聽器,但在迭代循環,使那個籃子該行的標籤,像這樣的東西:

row3.setTag(basket2); 
0

無法充分解密您的代碼。但我建議在onClick()中輸入Log.v("Row id is: ", Integer.toString(v.getId()))並在LogCat中查看是否每次點擊時都會返回相同的值。另外,如果我正在編寫類似的功能,我可能想要在onClick()中執行行信息的提取,所以信息從行中提取並立即放入捆綁包中,而不是在過程中將值傳入捆綁包中迭代器。喜歡的東西:

public void onClick(View v) { 
    String a; //extras for bundle 
    Bundle basket2 = new Bundle(); 
    //iterate row's children and assign values to string here 
    for(int i = 0; i < v.getChildSize(); i++){ 
     TextView t = (TextView)v.getChildAt(i); 
     //assignment 
     basket2.putString("someKey", a); 
    } 
    //send your intent 
} 
+0

我得到行= 4,無論我選擇哪一行,所以是的,它返回相同的值 – Sheila 2013-04-24 01:32:28

+0

我想我不理解你的第二個評論。我將如何提取onClick中的行信息?以前,我在迭代器外部有onClick,但仍然得到相同的結果。 – Sheila 2013-04-24 01:36:50

+0

@Sheila在'row3.setId(t);'中究竟是't'?我找不到你在哪裏申報。 – StoneBird 2013-04-24 01:39:20

相關問題