在RecyclerView中更改点击文字和背景

时间:2018-07-16 17:24:58

标签: android android-recyclerview onclick onclicklistener

我有一个RecyclerView,并且想要在单击时更改文本和项目背景。并再次单击将其更改回初始状态。默认情况下,初始文本和背景是使用XML设置的。

如果需要查看更多代码,请在注释中写上。


WindowAdapter.java

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);
        }
    }
}

3 个答案:

答案 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更改为取消选择状态。