Как я могу получить идентификатор проверенных флажков из реселлера в Android Studio? - PullRequest
0 голосов
/ 30 апреля 2019

У меня повторный просмотр с несколькими флажками.текст и идентификатор флажков, полученных от API.Я должен отправить идентификатор проверенных флажков в API.Теперь у меня есть две проблемы:

  • как получить проверенные идентификаторы флажков и сохранить в строковом значении?эта строка должна использоваться в упражнении.
  • , когда пользователь нажимает на флажок, и этот флажок установлен, идентификатор флажка сохраняется в строке.Теперь пользователь сожалеет и снимает флажок.в String идентификатор флажка должен быть удален.

Одно из моих решений:

  • создать модель данных (Info_Checkbox), которая содержит метод get и set ID.
  • create ArrayList.
  • установить идентификатор флажка в этом списке массивов и использовать этот массив для отправки параметров на сервер.

Но мой код неверен!Когда я установил несколько флажков, список массивов сохранил идентификатор последних флажков.Вы можете мне помочь?

Context context;
public ArrayList<Info_Filter> items = new ArrayList<>();
public SparseBooleanArray array = new SparseBooleanArray();
public List<Info_Filter> orig;
public ArrayList<Info_Checkbox> checkboxes = new ArrayList<>();
private Info_Checkbox info_checkbox = new Info_Checkbox();
public AdapterRecyFilterGroup(Context context, ArrayList<Info_Filter> items) {
    this.context = context;
    this.items = items;
}
@NonNull
@Override
public SetViewHolderFilter onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.sample_filter_grouping, viewGroup, false);
    return new SetViewHolderFilter(view);
}
@Override
public void onBindViewHolder(@NonNull SetViewHolderFilter setViewHolderFilter, int i) {
    setViewHolderFilter.checkBox.setText(items.get(i).getName());
    if (array.get(i)) {
        setViewHolderFilter.checkBox.setChecked(true);
    } else {
        setViewHolderFilter.checkBox.setChecked(false);
    }
}
@Override
public int getItemCount() {
    return items == null ? 0 : items.size();
}

public class SetViewHolderFilter extends RecyclerView.ViewHolder {
    CheckBox checkBox;
    public SetViewHolderFilter(@NonNull final View itemView) {
        super(itemView);
        checkBox = itemView.findViewById(R.id.cb_filter);
        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (array.get(getAdapterPosition())) {      //!checked
                    array.put(getAdapterPosition(), false);
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.remove(info_checkbox);
                } else {        //checked
                    array.put(getAdapterPosition(), true);
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.add(info_checkbox);
                }
                notifyDataSetChanged();
            }
        });
    }
}

и в Деятельности:

private String getCheckboxes(ArrayList<Info_Checkbox> checkboxes) {

    String category = "";
    for (int i = 0; i < checkboxes.size(); i++) {
        category = checkboxes.get(i).getId() + "," + category;
    }
    Log.i("asfaf", category);
    checkboxes.clear();
    return category;
}

, если id отмеченных флажков равен {7,5}, этот метод возвратил {5,5}.

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Вам нужно сохранить один выбранный список элементов в вашем адаптере. и просто добавьте и удалите элемент из этого списка на прослушивателе CheckedChanged. и после нажатия кнопки «Отправить» или в любом другом месте вы можете взять этот список из своего адаптера и просто отобразить этот список и получить только список строк, который будет выбранным списком идентификаторов. и вы можете объединить это в одну строку через запятую. для присоединения списка идентификаторов к строке вы можете.

TextUtils.join(",",[Your IDs list])

0 голосов
/ 30 апреля 2019

Ваша ошибка заключается в записи идентификатора CheckBox, в то время как CheckBox повторно используется RecyclerView, т. Е. Тот же CheckBox используется для элемента 1, и когда элемент 1 прокручивается за пределы экрана и элемент 7 выходит на экран, тот же привязанный блок CheckBox к пункту 7.

Так что, если вы отметите пункт 1, а затем прокрутите и отметите пункт 7, в ваших флажках вы получите один и тот же идентификатор дважды.

Глядя на ваш код, эти коды не нужны:

public ArrayList<Info_Checkbox> checkboxes = new ArrayList<>();
private Info_Checkbox info_checkbox = new Info_Checkbox();

                info_checkbox.setId(items.get(getAdapterPosition()).getId());
                checkboxes.remove(info_checkbox);

                info_checkbox.setId(items.get(getAdapterPosition()).getId());
                checkboxes.add(info_checkbox);

Вы можете получить индексы проверенного элемента из массива, в котором записывается, какие элементы проверены (проверить истинные элементы в массиве):

public SparseBooleanArray array = new SparseBooleanArray();

Это даст вам полный проверенных предметов:

private String getCheckedItems() {

    String category = "";
    for (int i = 0; i < items.size(); i++) {
        if (array.get(i, false))
            category = category + String.valueOf(i) + ",";
    }
    Log.i("asfaf", category);
    return category;
}
0 голосов
/ 30 апреля 2019

Раствор 1

Здесь вы создали только один экземпляр info_checkbox и каждый раз добавляете один и тот же экземпляр в список. Вот это создает проблему. Для каждой позиции элемента необходимо создать экземпляр класса и добавить его в список или удалить из списка.

Раствор 2

Вы можете пройти по объекту SparseBooleanArray и получить элемент из списка на основе позиции из ваших данных и создать необходимые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...