简体   繁体   English

RecyclerViewAdapter 中的设置器不起作用?

[英]Setter in RecyclerViewAdapter not working?

I have a boolean in my onBindViewHolder which decides whether a button is clickable or not.我的 onBindViewHolder 中有一个 boolean ,它决定按钮是否可点击。 In the constructor I set this value to false, later when the user unlocks something I want to set it to true with a setter.在构造函数中,我将此值设置为 false,稍后当用户解锁某些内容时,我想使用 setter 将其设置为 true。

Here is my RecyclerViewAdapter.java:这是我的 RecyclerViewAdapter.java:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private ArrayList<Items> items;
    Context mContext;
    private boolean unlocked;

    public RecyclerViewAdapter(Context context, ArrayList<Items> items, boolean unlocked) {
        mContext = context;
        this.items = items;
        this.unlocked = tabUnlocked;
    }

    public void setUnlocked(boolean unlocked) {
        this.unlocked = unlocked;
        this.notifyDataSetChanged();
    }

    @NonNull
    @Override
    public RecyclerViewAdapter.iewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        v.setLayoutParams(lp);
        return new RecyclerViewAdapter.ViewHolder(v);
    }




    @Override
    public void onBindViewHolder(@NonNull final RecyclerViewAdapter.ViewHolder holder, int position) {
        final Items currentItem = items.get(position);

        final String name = currentItem.getName();
        holder.itemTextView.setText(name);

  
        holder.itemTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (unlocked) {
                     //do something
                }
            }
        }); 
    }

 

    @Override
    public int getItemCount() {
        return item.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView itemTextView; 

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            itemTextView = itemView.findViewById(R.id.textViewItem); 
        }
    }



}

And here is how I call the Setter to change it: I make the RecyclerView public:下面是我如何调用 Setter 来更改它:我将 RecyclerView 公开:

public RecyclerViewAdapter adapter;

Then I create an instance in my onCreate:然后我在我的 onCreate 中创建一个实例:

recyclerView = rootView.findViewById(R.id.recyclerView); 
adapter = new RecyclerViewAdapter(items);
recyclerView.setAdapter(adapter);

And when the user unlocks a certain thing I call this method of the current Class:当用户解锁某个东西时,我调用当前 Class 的这个方法:

public void unlockTab() {
 
    adapter.setUnlocked(true); 

}

When I log the boolean inside of that setter it tells me it got changed.当我在该设置器中记录 boolean 时,它告诉我它已更改。 But when I log the boolean inside the onBindViewHolder it still remains false.但是当我在 onBindViewHolder 中记录 boolean 时,它仍然是错误的。

Why is the setter method not setting the boolean to true in the whole RecyclerViewAdapter.java class?为什么setter方法没有将整个RecyclerViewAdapter.java class中的boolean设置为true?

Hope someone can help me!希望可以有人帮帮我!

EDIT I already tried adding "this.notifyDataSetChanged();"编辑我已经尝试添加“this.notifyDataSetChanged();” to the Setter Method (Thanks to @a_local_nobody)到 Setter 方法(感谢 @a_local_nobody)

Adapters are responsible for changes to recyclerviews.适配器负责对 recyclerviews 的更改。 but if you don't tell them something changed, they won't know to do so.但如果你不告诉他们发生了什么变化,他们就不会知道这样做。

call notifyDataSetChanged();调用notifyDataSetChanged();

public void unlockTab() {
 
    adapter.setUnlocked(true); 
    adapter.notifyDataSetChanged();

}

what does it do?它有什么作用?

It tells your recyclerview to bind all the data again, so then your changes will apply它告诉您的 recyclerview 再次绑定所有数据,因此您的更改将适用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM