2016-01-22 33 views
0

我在創建的自定義對話框中有一個列表視圖。在該列表視圖中有兩個textview和一個複選框。當我關閉對話框並重新打開它,所有的選擇checkboxces獲得未選擇的,我想在選中狀態的複選框,但目前越來越unselected.Please幫助如何保持列表視圖複選框狀態持續存在於自定義對話框中

public void myListView() throws Exception { 
    final JSONArray jArray = nominationQuery(); 
    final Dialog dialog = new Dialog(mContext); 
    dialog.setContentView(R.layout.user_custom_dialog); 
    userTextView = (ListView) dialog.findViewById(R.id.userNominationList); 
    userTextView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    userAdapter = new UserAdapter(mContext, R.layout.user_list_row, jArray); 
    userTextView.setAdapter(userAdapter); 
    dialog.setTitle(AppConstants.NOMINATE_TITLE); 
    dialog.show(); 
    dialog.setCanceledOnTouchOutside(false); 
    Window window = dialog.getWindow(); 
    window.setLayout(400, 500); 
    Button submit = (Button) dialog.findViewById(R.id.submitButton); 

    submit.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ArrayList<String> selectedUser = new ArrayList<String>(); 
      if (userAdapter.mCheckStates.size() > 0) { 
       for (int i = 0; i < userAdapter.getCount(); i++) { 
        if (userAdapter.mCheckStates.get(i) == true) { 
         String user = null; 
         try { 
          user = jArray.getJSONObject(i).get(NAME) 
            .toString(); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         selectedUser.add(user); 


        } 

       } 
       } 
       if (selectedUser.size() > 0) { 
        NominationAdapter nominationAdapter = new NominationAdapter(
          mContext, R.layout.user_nominated, selectedUser); 
        nominateListView.setAdapter(nominationAdapter); 
        dialog.dismiss(); 

      } else{ 
       Toast.makeText(mContext, AppConstants.SELECT_THE_USER, 
         Toast.LENGTH_SHORT).show(); 
      }  
     } 
    }); 

    Button closeButton = (Button) dialog.findViewById(R.id.closeButton); 
    closeButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      dialog.cancel(); 
     } 
    }); 
} 

和我的用戶Adapter類

@Override 
public View getView(int position, View userView, ViewGroup parent) { 
    View row = userView; 
    NominationUserViewHolder userHolder; 
    JSONObject jsonObj; 
    if (row == null) { 
     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
     row = inflater.inflate(resourceId, parent, false); 
     userHolder = new NominationUserViewHolder(); 
     userHolder.nameTextView = (TextView) row 
       .findViewById(R.id.nameView); 
     userHolder.idTextView = (TextView) row.findViewById(R.id.idView); 
     userHolder.chkBox = (CheckBox) row.findViewById(R.id.checkBoxView);  
     row.setTag(userHolder); 
     row.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       NominationUserViewHolder uvv = (NominationUserViewHolder) view.getTag(); 
       // CheckBox cb = (uvv.chkBox) view.getTag(); 
       if (uvv.chkBox.isChecked()) { 
        uvv.chkBox.setChecked(false); 
       } else { 
        uvv.chkBox.setChecked(true); 
       } 

      } 
     }); 

    } else { 
     userHolder = (NominationUserViewHolder) row.getTag(); 
    } 
    try { 
     if (userJson != null) { 
      jsonObj = userJson.getJSONObject(position); 
      String userText = jsonObj.getString(NAME); 
      String idText = jsonObj.getString(EMAIL); 
      // userHolder.textView.setTag(userText); 
      userHolder.nameTextView.setText(userText); 
      userHolder.idTextView.setText(idText); 
      userHolder.chkBox.setTag(position); 
      userHolder.chkBox.setChecked(mCheckStates.get(position, false)); 
      userHolder.chkBox.setOnCheckedChangeListener(this); 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return row; 
} 

public boolean isChecked(int position) { 
    return mCheckStates.get(position, false); 
} 

public void setChecked(int position, boolean isChecked) { 
    mCheckStates.put(position, isChecked); 

} 

public void toggle(int position) { 
    setChecked(position, !isChecked(position)); 

} 

@Override 
public int getCount() { 
    return userJson != null ? userJson.length() : 0; 
} 

class NominationUserViewHolder { 
    TextView nameTextView; 
    TextView idTextView; 
    CheckBox chkBox; 

} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    //toggle((Integer) buttonView.getTag()); 
    mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
} 
} 
+0

[實現與複選框對話框]可能的重複(http://stackoverflow.com/questions/17859514/implementing-dialog-box-with-checkboxes) – 0X0nosugar

回答

0

可能存在一個錯誤,在您發佈的代碼段中看不到。您有一個userJson對象,並且只有當它不爲空時纔會調用userHolder.chkBox.setChecked(),但我在代碼中看不到任何對userJson的分配。

你或許應該更改下面的代碼:

try { 
    if (userJson != null) { 
     jsonObj = userJson.getJSONObject(position); 
     String userText = jsonObj.getString(NAME); 
     String idText = jsonObj.getString(EMAIL); 
     // userHolder.textView.setTag(userText); 
     userHolder.nameTextView.setText(userText); 
     userHolder.idTextView.setText(idText); 
     userHolder.chkBox.setTag(position); 
     userHolder.chkBox.setChecked(mCheckStates.get(position, false)); 
     userHolder.chkBox.setOnCheckedChangeListener(this); 
    } 

} catch (JSONException e) { 
    e.printStackTrace(); 
} 

到:

String userText, idText; 
    try { 
    if (userJson != null) { 
     jsonObj = userJson.getJSONObject(position); 
     userText = jsonObj.getString(NAME); 
     idText = jsonObj.getString(EMAIL); 
    } 
} catch (JSONException e) { 
    e.printStackTrace(); 
    userText = ""; // put value for case when userJson is null here 
    idText = ""; 
} 

// userHolder.textView.setTag(userText); 
userHolder.nameTextView.setText(userText); 
userHolder.idTextView.setText(idText); 
userHolder.chkBox.setTag(position); 
userHolder.chkBox.setChecked(mCheckStates.get(position, false)); 
userHolder.chkBox.setOnCheckedChangeListener(this); 

,這樣的userHolder所有屬性都設置每當getView被調用,否則你會看到過期數據。

+0

是的我想我需要在我的代碼中執行此操作。但我的問題仍然是一樣的。 –

+0

必須有一個微妙的錯誤,繼續搜索。 – Oliv

相關問題