我在自己创建的自定义对话框中有一个列表视图。该列表视图中有两个textview和一个复选框。当我关闭对话框并重新打开它时,所有选中的复选框都被取消选中,我希望这些复选框处于选中状态但当前未被选中。请帮助
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();
}
});
}
和我的用户适配器类
@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 :(得分: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
的所有属性,否则您将看到陈旧数据。