如何将按钮引用活动传递给适配器android

时间:2018-06-12 11:52:30

标签: java android

我将创建一个活动。

  • 在活动中,我会带一个Recyclerview和一个Button。
  • 第二,我将为Recyclerview .xml创建一个ROW。在这一行中,我将采用Cardview,TextView,CheckBox,Image等。

现在我将在此适配器声明复选框和图像中创建一个adapter.class 并初始化两个小部件。

现在我想要检查复选框,然后按钮可以visible。如果未选中复选框,则按钮为gone

为此我将尝试adapter.class中的代码:

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(checkBox.isChecked()){
                    btnDownload.setVisibility(View.VISIBLE);
                }
            }
        });

但问题是btnDownload是空对象引用错误可以显示。

我知道为什么这个错误来自becoz Button可以在Activity中声明我将在adapter.class中使用然后错误可以显示但很热我解决了这个

如何在适配器android ???

中使用活动按钮

3 个答案:

答案 0 :(得分:1)

只需在Activity中声明按钮:

public static Button btnDownload;
onCreate

中的

btnDownload = (Button) findViewById(R.id.btnDownload);

现在在Adapter中使用此按钮参考:

ActivityName.btnDownload.setVisibility(View.VISIBLE);

现在,只需在Adapter

中复制并粘贴以下代码即可
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(checkBox.isChecked()){
                    ActivityName.btnDownload.setVisibility(View.VISIBLE);
                }
            }
        });

Adapter课程中写下以下代码:

初始化变量checkBoxCount = 0;

现在写下面的代码: -

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                    checkedBoxesCount++;
                else
                    checkedBoxesCount--;

                if(checkedBoxesCount > 0 ){
                    EquipmentDataActivity.btnDownload.setVisibility(View.VISIBLE);
                }else{
                    EquipmentDataActivity.btnDownload.setVisibility(View.GONE);
                }
            }
        });

答案 1 :(得分:0)

使用具有getButton()方法的接口 在适配器构造函数中传递该接口(活动的这个)并将其保存为局部变量。 相反,btnDownload.setVisibility()执行interface.getButton()。setVisibility() 您的活动正在实施界面

答案 2 :(得分:0)

将按钮传递给recyclerview适配器是个坏主意,它可能会导致内存泄漏

更好的办法是在checkBox satte更改回调时将回调设置为recyclelerView winch并在回调中更改按钮的可见性

这里是例子:

适配器:

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
List<String> items=new ArrayList<>();

MyCallBack callBack;

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false));
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(callBack!=null){
                callBack.onCheckBoxStateChanged(b);
            }
        }
    });
}

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


public void setCallBack(MyCallBack callBack) {
    this.callBack = callBack;
}

public interface MyCallBack {
    void onCheckBoxStateChanged(boolean newState);
}

    }

查看持有人:

class MyViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBox;

public MyViewHolder(View itemView) {
    super(itemView);
    checkBox=itemView.findViewById(R.id.chekcbox)
}
}

MyCallback:

public interface MyCallBack{
void onCheckBoxStateChanged(boolean newState);
}

活动:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    MyAdapter myAdapter=new MyAdapter();

    Button button=findViewById(R.id.button);

    myAdapter.setCallBack(new MyAdapter.MyCallBack() {
        @Override
        public void onCheckBoxStateChanged(boolean newState) {

            if(newState)button.setVisibility(View.VISIBLE);
            else button.setVisibility(View.GONE);

        }
    });


}