2011-03-09 42 views
0

我一直在研究這個應用程序,但遇到了一個我一直無法弄清楚的問題。我有一個用適配器內容填充的列表視圖,每行都有它們的特定信息(統一)。當我嘗試檢索在特定行中找到的複選框的值時,問題就出現了。AlertDialog.Builder訪問特定行的問題

有問題的代碼如下:

我建立一個AlertDialog對象,所以我可以從用戶那裏得到我的信息。我的佈局代碼由一個水平方向的LinearLayout組成,其中3個元素爲圖像,文本和複選框。我用R.layout.listview_layout構建AlertDialog,這是我製作的自定義佈局。

我試圖做的一件事是從適配器獲取CheckBox視圖,但是;當我通過cb.isChecked()來查看它時,無論我在哪個行上總是未選中(又名爲false)。爲了進一步調試,我使用了相同的適配器,並通過相同的方法檢索了文本,並返回了有關該行的特定信息,因爲它應該如此。

任何想法如何處理?

簡單地說:

我只是想在每一個給定行獲得複選框的值

c = help.returnContacts();

AlertDialog.Builder ab = new AlertDialog.Builder(this); 
    ab.setTitle("Select contacts"); 

    final SimpleCursorAdapter adapter = new SimpleCursorAdapter(
      getApplicationContext(), R.layout.listview_layout, c, 
      new String[] { ClientOpenDbHelperUtility.COL_NAME, 
        ClientOpenDbHelperUtility.COL_SEL }, new int[] { 
        R.id.txt_name, R.id.cb_select }); 
    ab.setAdapter(adapter, null); 

    ab.setPositiveButton("Confirm", new Dialog.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      Cursor c = adapter.getCursor(); 
      for (int i = 0; i < adapter.getCount(); i++) { 

       CheckBox cb = (CheckBox) adapter.getView(i, null, null) 
         .findViewById(R.id.cb_select); 
       TextView t = (TextView) adapter.getView(i, null, null) 
         .findViewById(R.id.txt_name); 

       Log.d("DEBUG", "Checked = " + cb.isChecked()); 
       Log.d("DEBUG", "Message = " + t.getText().toString()); 
       if (cb.isChecked()) { 

        help 
          .updateSelection(
            c 
              .getColumnIndex(ClientOpenDbHelperUtility.COL_UID), 
            true); 
       } else { 
        help 
          .updateSelection(
            c 
              .getColumnIndex(ClientOpenDbHelperUtility.COL_UID), 
            false); 
       } 

      } 
      c.close(); 
      help.closeAll(); 

     } 

    }); 
    ab.show(); 

} 

感謝您的閱讀!

回答

2

您不應直接致電getView。這樣做會根據數據庫的內容生成新的視圖(或回收並覆蓋舊視圖)。此外,一旦您的行滾動屏幕的頂部或底部,它們將被回收用於出現的新行中。當您調用onClick方法時,您所有的數據,但當前可見的行很可能已經消失。

你有兩個選擇:

  1. 堅持更改立即到數據庫 - 設定你的複選框,或者在該行的OnClickListener和更新您的每次點擊事件數據庫。

  2. 更改保存到一個實例變量,再後來申請 - 定義的活動爲您Map<Integer, Boolean> changes實例變量,並調用changes.put(position, isChecked)每當有一個點擊。然後,當你的用戶點擊「應用」或任何你的onClick,通過changes並堅持每一個到數據庫。它基本上與您現在擁有的一樣,除非您將使用穩定的對象來存儲未保存的更改。

+0

謝謝,我會試試! – JoxTraex 2011-03-09 05:08:57