RecyclerView onBindViewHolder поведение onclicklistener

Я пытаюсь загрузить представление переработчика, в котором перечислены карты, каждая карта состоит из четырех элементов. два текстовых представления (posttext, score - это идентификатор) и две кнопки (minusOne и plusOne).

Приведенный ниже код правильно загружает содержимое и кнопки текстового представления на всех карточках.

Я пытаюсь реализовать следующее поведение.

onbuttonclick кнопки plusOne, оценка будет изменена, а кнопка minusOne скрыта.

Странно то, что результаты корректно обновляются на соответствующих картах. Но скрытая часть, по-видимому, происходит на нескольких картах, когда действие выполняется на одной карте (каждая n+5-я карта). Как это исправить? Где я ошибаюсь? Спасибо.

P.S. Предлагаю изменить название

@Override
    public void onBindViewHolder(
            final MyViewHolder viewHolder, final int position) {


        ParseObject model = items.get(position);
        viewHolder.posttext.setText(model.getString("postText"));
    viewHolder.score.setText(Integer.toString(model.getInt("score")));



        viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                ParseObject model = items.get(position);

                final int score = model.getInt("score");

                model.increment("score", 1);

                model.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {

                        if(e==null)
                        {
                            viewHolder.score.setText(Integer.toString(score+1));
                            viewHolder.minusOne.setVisibility(View.GONE);

                        }
                        else{
                            e.printStackTrace();
                           }
                    }
                });
            }
        });

person 55597    schedule 20.05.2015    source источник
comment
У меня нет опыта использования RecycleView, но то же самое произойдет, если вы используете ArrayAdapter или аналогичный. Я предполагаю (используя знания из ArrayAdapter), что вам нужно охватить все ветки логики. Что-то вроде if (score > 0) set visible else set invisible. Таким образом, видимость определяется каждый раз при вызове onBindViewHolder, а также для повторно используемых представлений.   -  person cYrixmorten    schedule 30.05.2015
comment
О, хорошо, только что прочитал ответ yousef и заметил, что его идея более или менее такая же. Хотя вместо того, чтобы отслеживать список логических значений, я бы читал состояние напрямую.   -  person cYrixmorten    schedule 30.05.2015
comment
Спасибо, что нашли время, чтобы помочь!! Попробую решение Yousef.   -  person 55597    schedule 30.05.2015


Ответы (1)


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

@Override
public void onBindViewHolder(
        final MyViewHolder viewHolder, final int position) {


    ParseObject model = items.get(position);
    viewHolder.posttext.setText(model.getString("postText"));
    viewHolder.score.setText(Integer.toString(model.getInt("score")));

     if (miusButtonStatus.get(position)) {
        viewHolder.minusOne.setVisibility(TextView.VISIBLE);
     } else {
        viewHolder.minusOne.setVisibility(TextView.GONE);
     }

    viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            ParseObject model = items.get(position);

            final int score = model.getInt("score");

            model.increment("score", 1);

            model.saveInBackground(new SaveCallback() {
                @Override
                public void done(ParseException e) {

                    if(e==null)
                    {
                        viewHolder.score.setText(Integer.toString(score+1));
                        miusButtonStatus.get(position) = false;
                        notifyDataSetChanged();

                    }
                    else{
                        e.printStackTrace();
                       }
                }
            });
        }
    });
person Yousef Zakher    schedule 20.05.2015
comment
Предложенные вами изменения не имеют значения @yousef - person 55597; 20.05.2015
comment
У меня есть другое решение, и я попробую его, но оно требует дополнительных изменений, поэтому я отредактирую свой ответ. - person Yousef Zakher; 20.05.2015
comment
Юсеф - Я думаю, должен быть лучший способ, чем то, что вы предложили. что-то вроде тегов. - person 55597; 20.05.2015
comment
Что вы имеете в виду под тегами? у вас проблемы с реализацией моего пути? - person Yousef Zakher; 20.05.2015
comment
Приносим извинения за комментарии без тестирования вашего кода. Спасибо за ответы и ваше время. Оно работает! - person 55597; 02.06.2015