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

时间:2016-01-22 07:55:41

标签: android

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

1 个答案:

答案 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的所有属性,否则您将看到陈旧数据。