В представлении ресайклера, как мне создать новую карту при каждом нажатии кнопки или значка на этой карте

моя карточка состоит из некоторых текстовых представлений и текстов редактирования, таких как имя, продукт, код, количество, общее количество и т. д. Я хочу создать карточку в представлении ресайклера, чтобы при каждом нажатии кнопки (или + щелчок по значку) отображалась новая карта. И при нажатии последней кнопки ниже все значения edittexts всех карточек сохраняются в списке массивов. Я совсем запутался, как это сделать. Все учебные пособия, которые я вижу, либо анализируют, либо берут значения из любой базы данных, но я хочу, чтобы мои карты брали значения от пользователя и сохраняли, а также создавались при нажатии новой кнопки.


person Robin10    schedule 13.07.2017    source источник


Ответы (1)


Создайте файл макета my_card_view_item.xml с вашим CardView и определите адаптер для вашего RecyclerView следующим образом:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    List<String> myList;

    public MyAdapter(List<String> myList) {
        this.myList = myList;
    }

    public void addItem() {
        myList.add(new String());
        notifyItemInserted(myList.size() - 1);
    }

    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_card_view_item, parent, false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
        // bind your view

        holder.editText.setText(myList.get(position));
    }

    @Override
    public int getItemCount() {
        return myList.size();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder {

        EditText editText;
        Button btn_remove;

        public MyViewHolder(View itemView) {
            super(itemView);
            editText = (EditText) itemView.findViewById(R.id.editText);
            btn_remove = (Button) itemView.findViewById(R.id.btn_remove);

            editText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    myList.set(getAdapterPosition(), charSequence.toString());
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });


            btn_remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    myList.remove(getAdapterPosition());
                    notifyItemRemoved(getAdapterPosition());
                    notifyItemRangeChanged(getAdapterPosition(), myList.size());
                }
            });
        }
    }
}

Вам необходимо сохранить введенные пользователем данные и показать их в методе onBindViewHolder, чтобы предотвратить потерю данных или конфликт данных.
Создайте экземпляр адаптера и установите его в свой RecyclerView. Теперь в событии OnClickListener вашей кнопки + вызовите метод addItem вашего адаптера:

    btn_add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            adapter.addItem();
        }
    });

Наконец, вы можете получить значение EditText для всех карт и сохранить его в массиве:

    btn_final.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (int i = 0; i < adapter.getItemCount(); i++) {
                EditText et = (EditText) recyclerView.getLayoutManager().findViewByPosition(i).findViewById(R.id.edit_text);
                // Store et.getText() in your array
            }
        }
    });
person SiSa    schedule 13.07.2017
comment
хорошо, но что это за какой-то класс? и почему вы создали для него список массивов? - person Robin10; 14.07.2017
comment
программа показывает исключение нулевого указателя после выполнения в getItemcount() - person Robin10; 14.07.2017
comment
если вам не нужно привязывать некоторые данные к вашему представлению, вы можете удалить список и использовать только переменную int в качестве ItemCount и увеличить ее в addItem. Я могу отредактировать свой ответ в этом случае, если хотите - person SiSa; 14.07.2017
comment
я немного смущен этим, хотя это очень хорошее решение, могу ли я получить ваш адрес электронной почты, если это возможно? - person Robin10; 14.07.2017
comment
и у меня нет данных для передачи на мои карты, на самом деле мне нужно брать данные с моих карт только из редактируемых текстов на картах... Итак, какие изменения я должен внести в этот код? - person Robin10; 14.07.2017
comment
он работает хорошо, я еще не включил нажатие кнопки, но я сделаю это, еще одна вещь, когда я создал объект myadapter в основной деятельности, я передал 1 в качестве аргумента в конструкторе. теперь он работает нормально, но после того, как я нажму кнопку, я должен оставить его равным 1? или какое значение я должен написать там? - person Robin10; 14.07.2017
comment
входное значение конструктора предназначено для определения того, сколько элементов мы хотим в начале. вы можете оставить его как 1 для начала. - person SiSa; 14.07.2017
comment
эй, код работает нормально, у меня есть только одна проблема, я добавил кнопку удаления так же, как и кнопку добавления. Поэтому, когда нажимается это удаление, карта удаляется. Но проблема в том, что когда я нажимаю кнопку «Добавить» и когда я заполняю значения, предположим, 3 карты, затем, когда я нажимаю кнопку «Удалить» карты 2, первая карта 3 удаляется, затем снова я нажимаю, а вторая карта удаляется. Таким образом, в основном он начинает удалять карты снизу, а не саму карту, на которую я нажимаю. Другое дело, когда я нажимаю «Добавить» после удаления, те же значения предыдущих карт отображаются в новой карте. Пожалуйста помоги. - person Robin10; 14.07.2017
comment
если вы поможете мне только с этим, я был бы рад. Я реализовал кнопку удаления с notifyItemRemoved , она удаляет карту, но имеет проблему, упомянутую выше (сначала удаляет карты ниже). - person Robin10; 14.07.2017
comment
Я отредактировал свой ответ. вам нужно добавить кнопку удаления в макет my_card_view_item, чтобы удалить именно тот элемент, который вы хотите - person SiSa; 14.07.2017
comment
Эй, что я должен передать в конструкторе myadapter? и myList.add(new String()); при добавлении элемента будет достаточно добавить все тексты редактирования? и я должен написать метод editText.addTextChangedListener для всех текстов редактирования, верно? пожалуйста, объясни, приятель - person Robin10; 15.07.2017
comment
Вы можете создать новый список таким образом List<String> myList = new ArrayList<String>(); и добавить в него элемент следующим образом myList.add("");. Теперь передайте myList подрядчику. Да, вы должны написать метод addTextChangedListener для всех EditText. - person SiSa; 15.07.2017
comment
именно так я думал и пробовал прошлой ночью, делая List‹String› myList = new ArrayList‹String›(); а затем myList.add(); но я вижу, что добавление написано красным цветом, а затем, когда я попытался перестроить проект, он показывает ожидаемый идентификатор ошибки. - person Robin10; 15.07.2017
comment
о, я понял ошибку, я объявил в mainacitivity, а не в oncreate или каком-то другом методе, и спасибо, все работает очень хорошо :) Еще раз большое спасибо, вы все равно можете связаться, чтобы узнать больше? как адрес электронной почты или их вариант чата или следовать здесь? спасибо еще раз в любом случае :) - person Robin10; 15.07.2017
comment
рад помочь вам :) я не знаю, есть ли здесь способ связаться друг с другом - person SiSa; 15.07.2017