Как изменить фон определенного элемента c onClick в RecyclerView? - PullRequest
0 голосов
/ 21 февраля 2020

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

Мне удается изменить элемент обратно на оригинальный (белый фон), когда он нажимается во второй раз.

Любая помощь, пожалуйста?

Это мой адаптер RecyclerView

public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> {
    String charityData[], descriptionData[];
    int images[];
    Context context;

    public CharityListAdapter(Context ct, String charity[], String description[], int image[]) {
        context = ct;
        charityData = charity;
        descriptionData= description;
        images = image;

    }

    @NonNull
    @Override
    public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.data_row, parent, false);
        return new CharityListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final CharityListViewHolder holder,final int position) {


        holder.titleText.setText(charityData[position]);
        holder.descText.setText(descriptionData[position]);
        holder.charityImage.setImageResource(images[position]);

        holder.charityLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(holder.charityLayout.isSelected()) {
                    holder.charityLayout.setSelected(false);
                    System.out.println("Set to false");

                } else if(!holder.charityLayout.isSelected()){
                    holder.charityLayout.setSelected(true);
                    System.out.println("Set to true");
                }

                if(holder.charityLayout.isSelected()) {
                    holder.whiteBox.setBackgroundResource(R.drawable.bluebox);

                    DonateSelection.enableNextButton();
                    System.out.println("Blue Box");
                }

                if(!holder.charityLayout.isSelected()) {
                    holder.whiteBox.setBackgroundResource(R.drawable.box);

                    System.out.println("White Box");
                }
            }
        });

    }

    @Override
    public int getItemCount() {                                                        
        return images.length;
    }

    public class CharityListViewHolder extends RecyclerView.ViewHolder {
        TextView titleText, descText;
        ImageView charityImage;

        RelativeLayout whiteBox;
        RelativeLayout charityLayout;

        public CharityListViewHolder(@NonNull View itemView) {
            super(itemView);

            titleText = itemView.findViewById(R.id.titleText);
            descText = itemView.findViewById(R.id.descText);
            charityImage = itemView.findViewById(R.id.charityImage);
            whiteBox = itemView.findViewById(R.id.whiteBox);
            charityLayout = itemView.findViewById(R.id.charityLayout);


        }

    }
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Вместо запоминания выбранного макета / ViewHolder лучше запомнить выбранную позицию. В вашем адаптере добавьте:

private int positionSelected = -1;

-1 означает, что ни один не выбран.

А затем в конструкторе ViewHolder:

        public CharityListViewHolder(@NonNull View itemView) {
            super(itemView);

            ....

            charityLayout = itemView.findViewById(R.id.charityLayout);

            charityLayour.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {                    
                    positionSelected = getAdapterPosition();
                    notifyDataSetChanged();
                }
            }); 
        }

В вашем onBindViewHolder вы можете установить фон соответственно:

if (position == positionSelected) {
    // Set background for layout to indicate selected
} else {
    // Set background for layout to indicate unselected
}
1 голос
/ 21 февраля 2020

Это из-за того, как работает RecyclerView. Он перезаписывает ваш вид после того, как он исчезает с экрана. Вы должны использовать if / else для поддержания правильного состояния представления. Замените действие onClick приведенным ниже кодом.

 holder.charityLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(holder.charityLayout.isSelected()) {
                        holder.charityLayout.setSelected(false);
                        System.out.println("Set to false");

                    } else {
                        holder.charityLayout.setSelected(true);
                        System.out.println("Set to true");
                    }

                    if(holder.charityLayout.isSelected()) {
                        holder.whiteBox.setBackgroundResource(R.drawable.bluebox);

                        DonateSelection.enableNextButton();
                        System.out.println("Blue Box");
                    }else{

                        holder.whiteBox.setBackgroundResource(R.drawable.box);

                        System.out.println("White Box");
                    }



                }
            });

Отредактировано Вот необработанный код. Но я думаю, что это должно работать. Вы должны добавить массив состояния проверки, из которого состоит переработчик. По умолчанию все они будут ложными. Затем проверьте это на BindViewHolder (). При нажатии установите логическое значение true и вызовите notifyDatasetChanged.

public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> {
    String charityData[], descriptionData[];
    int images[]; boolean checkState[];
    Context context;

    public CharityListAdapter(Context ct, String charity[], String description[], int image[],boolean checkState[]) {
        context = ct;
        charityData = charity;
        descriptionData= description;
        images = image;
    checkState=checkState;  
    }

    @NonNull
    @Override
    public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.data_row, parent, false);
        return new CharityListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final CharityListViewHolder holder,final int position) {


        holder.titleText.setText(charityData[position]);
        holder.descText.setText(descriptionData[position]);
        holder.charityImage.setImageResource(images[position]);

    if(checkState[position]){
      holder.whiteBox.setBackgroundResource(R.drawable.bluebox);
          DonateSelection.enableNextButton();
    }else{
        holder.whiteBox.setBackgroundResource(R.drawable.box);
    }

        holder.charityLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        if(checkState[position]){
            checkState[position]=false;
        }else{
            checkState[position]=true;
        }
                 notifyDataSetChanged();
            }
        });

    }

    @Override
    public int getItemCount() {                                                        
        return images.length;
    }

    public class CharityListViewHolder extends RecyclerView.ViewHolder {
        TextView titleText, descText;
        ImageView charityImage;

        RelativeLayout whiteBox;
        RelativeLayout charityLayout;

        public CharityListViewHolder(@NonNull View itemView) {
            super(itemView);

            titleText = itemView.findViewById(R.id.titleText);
            descText = itemView.findViewById(R.id.descText);
            charityImage = itemView.findViewById(R.id.charityImage);
            whiteBox = itemView.findViewById(R.id.whiteBox);
            charityLayout = itemView.findViewById(R.id.charityLayout);


        }

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