Выберите из адаптера Android - PullRequest
0 голосов
/ 25 апреля 2018

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

enter image description here

Проблемы: «Если я выберу элемент № 1, а затем выбрал элемент № 4, как я могу удалить выбор из элемента № 1? Я не хочу нажимать элемент № 1 еще раз, чтобы удалить выбор»

Обратите внимание, что на этом экране пользователь может выбрать только один элемент.

Это мой код в Kotlin. Но если вы предлагаете решение в JAVA, то все в порядке:

var selectedBranch = false
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.packageNumber.text = branches?.get(position)?.nameEn ?: ""
    check = ContextCompat.getDrawable(context, R.drawable.ic_select_branch)
    holder.itemView.setOnClickListener {

        if(!selectedBranch) {
        holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, check, null)
            selectedBranch = true
        }
        else {
            holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
            selectedBranch = false
        }
    }
}

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Взять одну булеву переменную в класс branche pojo. затем превратите интерфейс в адаптер для обработки события клика в виде переработчика, как показано ниже:

  onItemClickListner onItemClickListner;

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner {
    void onClick(Branch str);//pass your object types.
}



@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    // below code handle click event on recycler view item.
    Branch data=branches.get(position);
    if (data.isSelected()){
    }
    else{

    }
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
}

затем, после привязки адаптера к представлению утилиты, вызовите код, приведенный ниже.

recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
        @Override
        public void onClick(Branch str)
        {
            str.setSelected(true);
            recyclerViewAdpater.notifyDataSetChanged();
        }

    });
0 голосов
/ 25 апреля 2018

Вам необходимо добавить это логическое значение selectedBranch в ваш класс данных, который вы использовали в качестве модели в списке ветвей

добавить этот код в bindViewHolder

if(branches?.get(position)?.selectedBranch == false) {

            holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
        }
        else {
            holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, check, null)
      }

holder.itemView.setOnClickListener {

    if(branches?.get(position)?.selectedBranch == false) {

        holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, check, null)
        branches?.get(position)?.selectedBranch = true
    }
    else {
        holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
        branches?.get(position)?.selectedBranch = false
    }
 adapter.notifyDatasetChange()
}

Я надеюсь, что этоработы.

0 голосов
/ 25 апреля 2018

Вместо использования флага в каждом элементе, Use integer variable to store the last clicked position

Первоначально clickedposition=-1

Используйте это в своем классе адаптера,

if(position == clickedposition) {

        holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, check, null)
}
else {
        holder.packageNumber.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)

}

holder.itemView.setOnClickListener {
      clickedposition=position;
      notifyDataSetChanged();
}
0 голосов
/ 25 апреля 2018

1.Создать один Model класс, содержащий

String text;
boolean isTextSelected;

2. При щелчке элемента в адаптере, Update поле модели isTextSelected вашей модели.

3.Notify ваш адпатер.

...