Android 如何保持自定义对话框中的listview复选框状态保持不变

Android 如何保持自定义对话框中的listview复选框状态保持不变,android,Android,在我创建的自定义对话框中有一个listview。该列表视图中有两个文本视图和一个复选框。当我关闭对话框并重新打开它时,所有选中的复选框都将取消选中,我希望这些复选框处于选中状态,但当前处于取消选中状态。请帮助 public void myListView() throws Exception { final JSONArray jArray = nominationQuery(); final Dialog dialog = new Dialog(mContext); d

在我创建的自定义对话框中有一个listview。该列表视图中有两个文本视图和一个复选框。当我关闭对话框并重新打开它时,所有选中的复选框都将取消选中,我希望这些复选框处于选中状态,但当前处于取消选中状态。请帮助

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();
        }
    });
}

可能有一个bug,从您发布的代码片段中看不到。您有一个
userJson
对象,只有当它不为null时才调用
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();
}
致:


因此,每当调用
getView
时,都会设置
userHolder
的所有属性,否则您将看到过时的数据。

可能重复的是,我想我需要在代码中执行此操作。但我的问题仍然是一样的。一定有一个微妙的错误,请继续搜索。
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);