如何保持列表视图复选框状态持续存在于自定义对话框中

问题描述:

我在创建的自定义对话框中有一个列表视图。在该列表视图中有两个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

可能存在一个错误,在您发布的代码段中看不到。您有一个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