Android 如何在RecyclerView中单击特定项目时更改其背景?
我正在尝试使RecyclerView中的选定项目在单击时更改其背景,但一旦单击RecyclerView中的其他项目,该项目的背景将更改,先前单击的项目将更改回原始项目 我只在第二次单击时将项目更改回原始(白色背景) 需要帮忙吗 这是我的RecyclerView适配器Android 如何在RecyclerView中单击特定项目时更改其背景?,android,android-recyclerview,Android,Android Recyclerview,我正在尝试使RecyclerView中的选定项目在单击时更改其背景,但一旦单击RecyclerView中的其他项目,该项目的背景将更改,先前单击的项目将更改回原始项目 我只在第二次单击时将项目更改回原始(白色背景) 需要帮忙吗 这是我的RecyclerView适配器 public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> { S
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);
}
}
}
公共类CharityListAdapter扩展了RecyclerView.Adapter{
字符串charityData[],descriptionData[];
int图像[];
语境;
public CharityListAdapter(上下文ct,字符串charity[],字符串描述[],整数图像[]){
上下文=ct;
慈善数据=慈善;
descriptionData=描述;
图像=图像;
}
@非空
@凌驾
public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
LayoutFlater充气机=LayoutFlater.from(上下文);
视图=充气机。充气(R.layout.data\u行,父项,false);
返回新的CharityListViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(@NonNull final CharityListViewHolder,final int position){
holder.titleText.setText(慈善数据[职位]);
holder.descText.setText(描述数据[位置]);
holder.charityImage.setImageResource(图像[位置]);
holder.charityLayout.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(holder.charityLayout.isSelected()){
holder.charityLayout.setSelected(假);
System.out.println(“设置为false”);
}如果(!holder.charityLayout.isSelected()),则为else{
holder.charityLayout.setSelected(真);
System.out.println(“设置为真”);
}
if(holder.charityLayout.isSelected()){
持有者.白盒.立根资源(R.可抽出.蓝盒);
DonateSelection.enableNextButton();
System.out.println(“蓝框”);
}
如果(!holder.charityLayout.isSelected()){
支架.白盒.立根资源(R.可拔模盒);
System.out.println(“白盒”);
}
}
});
}
@凌驾
public int getItemCount(){
返回图像长度;
}
公共类CharityListViewHolder扩展了RecyclerView.ViewHolder{
text查看titleText,descText;
图像查看慈善图像;
相对白盒;
相关慈善机构布局;
public CharityListViewHolder(@NonNull View itemView){
超级(项目视图);
titleText=itemView.findviewbyd(R.id.titleText);
descText=itemView.findviewbyd(R.id.descText);
charityImage=itemView.findViewById(R.id.charityImage);
whiteBox=itemView.findViewById(R.id.whiteBox);
charityLayout=itemView.findViewById(R.id.charityLayout);
}
}
}
这是因为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");
}
}
});
已编辑
这是原始代码。但是,我认为这应该行得通。您应该添加一个由recycler组成的检查状态数组。默认情况下,它们都将为false。然后,在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);
}
}
}
公共类CharityListAdapter扩展了RecyclerView.Adapter{
字符串charityData[],descriptionData[];
int图像[];布尔检查状态[];
语境;
public CharityListAdapter(上下文ct、字符串charity[]、字符串描述[]、整数图像[]、布尔检查状态[]){
上下文=ct;
慈善数据=慈善;
descriptionData=描述;
图像=图像;
checkState=checkState;
}
@非空
@凌驾
public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
LayoutFlater充气机=LayoutFlater.from(上下文);
视图=充气机。充气(R.layout.data\u行,父项,false);
返回新的CharityListViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(@NonNull final CharityListViewHolder,final int position){
holder.titleText.setText(慈善数据[职位]);
holder.descText.setText(描述数据[位置]);
holder.charityImage.setImageResource(图像[位置]);
如果(检查状态[位置]){
持有者.白盒.立根资源(R.可抽出.蓝盒);
DonateSelection.enableNextButton();
}否则{
支架.白盒.立根资源(R.可拔模盒);
}
holder.charityLayout.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(检查状态[位置]){
checkState[位置]=假;
}否则{
checkState[位置]=真;
}
notifyDataSetChanged();
}
});
}
@凌驾
public int getItemCount(){
返回图像长度;
}
公共类CharityListViewHolder扩展了RecyclerView.ViewHolder{
text查看titleText,descText;
图像查看慈善图像;
相对白盒;
相关慈善机构布局;
public CharityListViewHolder(@NonNull View itemView){
超级(项目视图);
titleText=itemView.findviewbyd(R.id.titleText);
descText=itemView.findViewById(R.id.descText)
private int positionSelected = -1;
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();
}
});
}
if (position == positionSelected) {
// Set background for layout to indicate selected
} else {
// Set background for layout to indicate unselected
}