我有一个RecyclerView,并且想要在单击时更改文本和项目背景。并再次单击将其更改回初始状态。默认情况下,初始文本和背景是使用XML设置的。
如果需要查看更多代码,请在注释中写上。
public class WindowAdapter extends RecyclerView.Adapter<WindowAdapter.WindowViewHolder> {
private Context mCtx;
private List<Window> windowList;
public WindowAdapter(Context mCtx, List<Window> windowList) {
this.mCtx = mCtx;
this.windowList = windowList;
}
@NonNull
@Override
public WindowViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mCtx);
View view = inflater.inflate(R.layout.list_layout, null);
return new WindowViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull WindowViewHolder holder, int position) {
Window window = windowList.get(position);
holder.textViewTitle.setText(window.getTitle());
holder.textViewChecked.setText(window.getCheck());
holder.imageView.setImageDrawable(mCtx.getResources().getDrawable(window.getImage()));
////////////////////////////////////////////////
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mCtx, "Clicked", Toast.LENGTH_SHORT).show();
}
});
//////////////////////////////////////
}
@Override
public int getItemCount() {
return windowList.size();
}
class WindowViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textViewTitle;
TextView textViewChecked;
RelativeLayout parentLayout;
public WindowViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
textViewTitle = itemView.findViewById(R.id.window_name);
textViewChecked = itemView.findViewById(R.id.window_check);
///////////////////////////////////////////
parentLayout = itemView.findViewById(R.id.parent_layout);
}
}
}
答案 0 :(得分:0)
您应该只可以在holder中的当前项目上说getText()和getBackackground()并将其保存到一些临时变量中,使用布尔值来跟踪是否已单击它,并使用它来将其设置回到原始版本。
答案 1 :(得分:0)
boolean isBackgroundChange = false;
public void onBindViewHolder(@NonNull WindowViewHolder holder, int position) {
Window window = windowList.get(position);
holder.textViewTitle.setText(window.getTitle());
// holder.textViewChecked.setText(window.getCheck());
// holder.imageView.setImageDrawable(mCtx.getResources()
// .getDrawable(window.getImage()));
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!isBackgroundChange){
holder.textViewChecked.setText("Button Clicked");
holder.parentLayout.setBackground(....); //set Background for RelativeLayout after button clicked
holder.imageView.setImageDrawable(......); // set the image which you want to show after button clicked.
isBackgroundChange = true;
}else{
holder.parentLayout.setBackground(....); // set previous background for realtiveLayout.
holder.textViewChecked.setText("Button Clicked again ");
holder.imageView.setImageDrawable(.....); // set the previous image.
isBackgroundChange = false;
}
}
});
}
答案 2 :(得分:0)
您必须将所选项目存储在ViewHolder
之外,以免滚动时丢失。
在适配器中创建一个private Window selectedWindow;
之类的字段。
建议onClickListener
在ViewHolders构造函数中仅初始化一次,因此在滚动过程中不要一直分配对象。
然后在您的onClick侦听器中,使用windowList.get(getAdapterPosition())
获取此ViewHolder
当前绑定的项目。将该项目存储为selectedWindow
,并选择单击的ViewHolder
视图(或者,如果已选择此窗口,则将该字段设置为null并清除选择)。
您必须在onBindViewHolder
内添加一个检查window == selectedWindow
。如果为true,请将您的ViewHolder
视图更改为选定状态。如果为false,则将您的ViewHolder
更改为取消选择状态。