2013-08-20 114 views
0

我有一個ListView,每行都包含textviewcheckboxBaseAdapter自動檢查中的複選框

允許用戶點擊每個TextView,有一次他做了DialogBox呈現給他,他預計將要麼選擇YesNo

當他選擇否時,TextView旁邊的CheckBox用戶點擊需要自動打勾。

,我面臨的問題是,無論哪個TextBox用戶選擇,在列表的最後CheckBox被選中的時候,而不是一個接一個地選擇TextView

調試後我發現這是因爲適配器類的getView()方法在最後一行停止,因此最後一行總是被選中。我試着爲每一行設置標籤,這樣我就可以相應地勾選checkbox,但之後都不會打勾Checkboxes

我將不勝感激在這個問題上的任何幫助。

.... 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ..... 
    holder.text.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(final View v) 
     { 
      final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
      builder.setTitle("Materials"); 
      builder.setMessage("Did you require any materials to fix this error?"); 
      builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        String clickedError;    
        clickedError = holder.text.getText().toString();   

        Intent intent = new Intent(mContext, Material.class); 
        intent.putStringArrayListExtra("materialList", materialList); 
        intent.putExtra("clickedError", clickedError); 
        intent.putExtra("repairID", repairID); 
        ((Activity)mContext).startActivityForResult(intent, 1); 
       } 
      }); 
      builder.setNegativeButton("No", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        //holder.chk.setChecked(true); // This ticks the last checkbox of the list. 

        if(holder.chk.getTag() == v.getTag()) 
        { 
         holder.chk.setChecked(true); 
        } 
       } 
      }); 
      builder.show(); 

     } 
    }); 

回答

1

嘗試通過該行的複選框到您的點擊收聽:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
..... 
holder.text.setOnClickListener(new MyClickListener(holder.chk); 
} 
private class MyClickListener implements OnClickListener 
{ 
    Checkbox checkbox = null; 
    public MyClickListener(final Checkbox checkbox) 
    { 
     this.checkbox = checkbox; 
    } 
    @Override 
    public void onClick(final View v) 
    { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
     builder.setTitle("Materials"); 
     builder.setMessage("Did you require any materials to fix this error?"); 
     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       String clickedError;    
       clickedError = holder.text.getText().toString();   

       Intent intent = new Intent(mContext, Material.class); 
       intent.putStringArrayListExtra("materialList", materialList); 
       intent.putExtra("clickedError", clickedError); 
       intent.putExtra("repairID", repairID); 
       ((Activity)mContext).startActivityForResult(intent, 1); 
      } 
     }); 
     builder.setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       //checkbox.setChecked(true); // This ticks the last checkbox of the list. 

       if(checkbox.getTag() == v.getTag()) 
       { 
        checkbox.setChecked(true); 
       } 
      } 
     }); 
     builder.show(); 

    } 
}); 
+0

這是行不通的。 – ClaireG

+0

你能更具體嗎?您可能必須確保您傳遞了適當的變量,例如mContext和clickedError(來自holder.text.getText()),因爲您正在引用這些對象。 –

+0

首先我不能比較v的getTag和'if(checkbox.getTag()== v.getTag())'的複選框,因爲v的生命只在getView()內開始和結束。其次,我認爲從View分離onClickListener將不會產生任何影響,因爲這裏的問題是getView()方法自創建它以來仍然突出顯示列表視圖的最後一行。這導致我得到最後一個複選框。無論如何,我認爲這是問題。 – ClaireG

1

複選框延伸的TextView。使用CheckBox.setText(CharSequence | int)將文本設置爲CheckBox並刪除TextView(當然,這不會解決您的檢查問題)。關於你的問題 - 這是因爲大多數AdapterView的重用視圖。將檢查的項目信息存儲在getView調用setChecked(checkedItems.get(pos))的地方。

@Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ..... 

     holder.chk.setChecked(checkedItems.get(position)) 

     ..... 

     builder.setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       //holder.chk.setChecked(true); // This ticks the last checkbox of the list. 

       if(holder.chk.getTag() == v.getTag()) 
       { 
        holder.chk.setChecked(true); 
        checkedItems.put(position, true); 
       } 
      } 
     }); 
    } 

凡checkedItems是SparseBooleanArray

+0

我嘗試了你的建議,但我仍然得到我的列表中的最後一個複選框檢查。 – ClaireG

+0

我相信這是因爲getView()的工作原理而發生的。由於getView()已停止創建最後一行,因此該行仍由所討論的方法選擇,因此其複選框會被檢查。 – ClaireG

相關問題